private double high; private int AGE; private String memo; 运行测试: Person person = new Person(); System.out.println(JSON.toJSONString(person)); 返回结果: {"high":0.0,"aGE":0} 问题描述: 我这个类中有三个字段,直接new一个对象,会丢失String类型的字段,同时AGE字段的名称也修改了。 如果不写get方法,这个方法返回的是{}。通过get反射会造成这个问题,直接通过反射字段呢??
Q
[alibaba/fastjson]JSON.toJSONString反射字段问题
3
A
回答
1
TypeUtils.compatibleWithJavaBean = false; TypeUtils.compatibleWithFieldName = true; 具体哪个配置项记不太清了,手机看源码不方便
7
@JOHNHYH TypeUtils.compatibleWithFieldName = true; 设置这个全局配置项就可以了
5
或者使用 fieldBased 方法. https://github.com/alibaba/fastjson/wiki/FieldBased_cn
5
有以下几种方法: 1.您说的fieldBased,在TypeUtils.buildBeanInfo利用computeGettersWithFieldBase方法创建的都是原来的字段,但是这种方法需要配置SerializeConfig,过于繁琐。 2.TypeUtils.compatibleWithFieldName = true;执行的是TypeUtils.buildBeanInfo中的computeGetters(代码1327行),这个方法会修改原有字段的属性名称,compatibleWithFieldName 为true会再次从Field字段中获取这个属性名称(代码1756行)但是在这个之前还是把属性的名称给修改了,流程有些繁琐。 3.TypeUtils.compatibleWithJavaBean =true;执行的是TypeUtils.buildBeanInfo中的computeGetters(代码1327行),但是在这个方法中直接取的是属性的名称。
对比三种方法,可以选择第三种执行,全局设置这个值,这样既可以避免了配置SerializeConfig,又减少了代码执行的流程。