关于json反序列化Map[]问题
在使⽤alibaba  的fastjson 进⾏对象发序列化时JSONObject.parseObject(text, Class.class) ,出现反序列化失败现象。经排查是由于对象bean中有⼀字段类型为Map<String,String>[]  map数组类型导致反序列化失败
在不是特别考虑效率的情况下(对于搜索、缓存等情形可以考虑使⽤thrift和protobuffer),选取jackson包中的ObjectMapper类对json串反序列化以得到相应对象。⽅法选取readValue(String content, Class<T>valueType)⽅法进⾏反序列化。
ObjectMapper objectMapper = new ObjectMapper();
UserTest  uerTest= null;
try {
uerTest= Body(), UserTest .class);
} catch (JsonParseException e) {
<("json转换异常", e);
e.printStackTrace();
fastjson字符串转数组} catch (JsonMappingException e) {
<("json映射异常", e);
e.printStackTrace();
} catch (IOException e) {
<("j通信异常", e);
e.printStackTrace();
}
ObjectMapper的readValue⽅法将json串反序列化为对象的过程⼤致为:依据传⼊的json串和⽬标对象类型分别创建JsonParse和JavaType,随后⽣成DeserializationConfig、DeserializationContext、JsonDeserializer,其中JsonDeserializer的实现类决定将要执⾏哪⼀种类型解析(Bean、Map、String等),JsonParse中存储了待解析字符串及其它信息,在解析的过程中通过token来判断当前匹配的类型
(例如:如果遇到{,将其判断为对象类型的起始位置;遇到[,将其判断为集合类型的起始位置),⼀旦确定了类型,则跳⼊与之对应的反序列化类中进⾏处理,得到结果,然后token往后移动,接着解析下⼀个串。可以看做类似递归的⽅式进⾏解析,当通过token判断为⼀个对象时,则会跳⼊BeanDeserializer中进⾏解析,随后遍历该对象的所有字段,如果字段是字符串,则跳到StringDeserializer中进⾏解析,如果字段是数组,则跳到CollectionDeserializer中进⾏解析,直到解析完整个字符串为⽌
==================================割===============================
⾃⼰做单元测试后,发现⾕歌的Gson 还是⾮常好使的,也不存在上诉问题
Gson gson = new Gson();
UserMessage fromJson = gson.fromJson(jsonString, UserMessage.class);
Map<String,String>[] maps = Users();
System.out.println("UserMessage"+Name());

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。