fastJson使用注意事项:
fastJson原理:
通过使用get方法来获取变量名和数值, 如果get返回字段类型和类字段不一样就会报错, 所以有两种情况, 第一种是字段类型不对, 第二种就是有get但是根本没有这个字段
案例
1.属性这么写要注意了
public String aTest;
public String getaTest() {
return aTest;
}
public void setaTest(String aTest) {
this.aTest = aTest;
}
这种get,set方法是自动生成的,这样会导致反序列化不回来,方法这样就可以getATest setATest.
还有这样
private String user_name;
public String getUser_name();
这样fastJson会自动将user_name转为userName, 导致变量名不统一, 所以尽量使用小驼峰命名
2. 注解@JSONField的使用, ,可以写在属性上,也可以写在方法上
定义序列化的key
@JSONField(name="ID")
使用serialize/deserialize指定字段不序列化
@JSONField(serialize=false)
@JSONField(deserialize=false)
一定要注意,如果在序列化的类里写的方法是以get开头的无参的,比如getTest()方法,即使这个类里没有test属性,fastjson还是会序列化到字符串中去,所以这种方法一定要serialize=false
3. 反序列化方法的传参问题
例如:
Map<String,Long> map = new ConcurrentHashMap<String,Long>();
String text = JSON.toJSONString(map);
Map<String,Long> map1 = JSON.parseObject(text,new TypeReference<ConcurrentHashMap<String, Long>>() {});
反序列化的时候第二个参数一定要这么写:
new TypeReference<ConcurrentHashMap<String, Long>>() {}
如果写成下面这样会导致一些问题,因为会反序列化成一些默认的实现类,而不是你需要的ConcurrentHashMap
new TypeReference<Map<String, Long>>() {}
4. 有个父类子类的问题,比如
Map<String,A> map = new HashMap<String,A>();
实际上put进去一个AA,AA是A的子类,这样反序列化回来的map里会是A,而不是AA,用下面方式解决
String s = JSON.toJSONString(o,SerializerFeature.WriteClassName);
或者调用序列化之前
JSON.DEFAULT_GENERATE_FEATURE |=SerializerFeature.WriteClassName.getMask();
5. 注意get和set方法入参和返回值类型要与成员变量的类型要一致
比如:
这种情况下就会导致空指针问题, 原理可以如下所示
报空指针异常的情况和这个基本一模一样