fastjson:
json反序列化的时候无法获得final域的值
jackson:
无法对接口反序列化,及不支持代理的pojo
共同问题
json序列化的时候map的key为对象是,将把对象序列化为一个损失命名信息的对象
及{"name":"wql","id":123}的对象将被序列化为{"wql",123}
解决方法:
给ObjectMapper注册能识别key的反序列化器(当然同时也要为你的
ObjectMapper注册一个专门序列化Map的序列化器)
mapper = new ObjectMapper();
Collection<Bean<?>> allBeans = getAllBean();
SimpleModule module = new SimpleModule(_moduleName, new Version(0, 0, 0, null));
for(Bean<?> bean : allBeans){
Class beanClass = bean.getClass();
MyKeyDeserializer deserializer = new JaneKeyDeserializer(beanClass);
module.addKeyDeserializer(beanClass, deserializer);
}
mapper.registerModule(module);
class MyKeyDeserializer extends KeyDeserializer{
static ObjectMapper mapper = new ObjectMapper();
Class targetClass ;
public JaneKeyDeserializer(Class targetClass) {
super();
this.targetClass = targetClass;
}
@SuppressWarnings("unchecked")
@Override
public Object deserializeKey(String arg0, DeserializationContext arg1) throws IOException, JsonProcessingException {
return mapper.readValue(arg0,targetClass);
}
}
关于json规范
json的key必须要带双引号,如果没带必须对jackson进行设置
json序列化时,对象的getter和setter必须符合命名规范,如驼峰法什么的就不说了
如果变量名为sRid那么它的getter应该是getsRid而不是getSRid这是一大坑
同样变量名不能首字母大写!如不能是Rid!