FastJson序列化类的问题

本文讨论了使用FastJson进行序列化时遇到的两个问题。一是FastJson默认遵循JavaBean规范,通过getter方法识别属性,因此非getter/setter方法前缀命名需谨慎。例如,getGrade方法会被误认为Grade属性。二是布尔类型属性不应以is开头,如isDeleted,否则可能导致框架反向解析时出现序列化错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. getter setter 的问题

有次开发中使用FastJson时出现了个bug,说是类里面没有某个属性,debug后发现它默认通过get方法取出属性值,也就是说FastJson默认通过JavaBean规范进行对象序列化。

所以命名方法时若不是类的getter/setter方法时,不要以get或set为前缀命名。

测试:

public class FastJsonTest {

    public static void main(String[] args) {
        // json转对象
        String jsonStr = "{\"name\":\"张三\"}";
        Student student = JSON.parseObject(jsonStr, Student.class);
        System.out.println("json转对象: "+student.toString());

        // 对象转json
        Student student1 = new Student();
        student1.setName("张三");
        String jsonString = JSONObject.toJSONString(student1);
        System.out.println("对象转json: "+jsonString);
    }

}

class Student {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // 无Grade属性
    public Integer getGrade() {
        return 100;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                '}';
    }

}

输出:

json转对象: Student{name='张三'}
对象转json: {"grade":100,"name":"张三"}

类中写了个getGrade方法,被认为是有一个Grade属性,这样在其它地方使用可能会有问题。

2. 布尔类型属性名不能以is开头

【强制】POJO类中的任何布尔类型的变量,都不要加is前缀,否则部分框架解析会引起序列 化错误。

说明:在本文MySQL 规约中的建表约定第一条,表达是与否的值采用 is_xxx的命名方式,所以,需要在 设置从 is_xxx到xxx的映射关系。

反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析的时 候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。

引自:Java开发手册(泰山版)编程规约,命名风格一节。

如果以 Boolean isDeleted 命名属性,那它对应getter方法的正确写法应该是isIsDeleted(),但是最好避免这样写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值