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反射会造成这个问题,直接通过反射字段呢??
4条答案
按热度按时间lskq00tm1#
TypeUtils.compatibleWithJavaBean = false;
TypeUtils.compatibleWithFieldName = true;
具体哪个配置项记不太清了,手机看源码不方便
nmpmafwu2#
@JOHNHYH TypeUtils.compatibleWithFieldName = true; 设置这个全局配置项就可以了
6l7fqoea3#
或者使用 fieldBased 方法. https://github.com/alibaba/fastjson/wiki/FieldBased_cn
z9smfwbn4#
有以下几种方法:
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,又减少了代码执行的流程。