关于json反序列化Map[] 问题

论坛 期权论坛 脚本     
匿名技术用户   2021-1-4 03:03   11   0

在使用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= objectMapper.readValue(message.getBody(), UserTest .class);
} catch (JsonParseException e) {
logger.error("json转换异常", e);
e.printStackTrace();
} catch (JsonMappingException e) {
logger.error("json映射异常", e);
e.printStackTrace();
} catch (IOException e) {
logger.error("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 = fromJson.getUsers();
    System.out.println("UserMessage"+fromJson.getName());

转载于:https://www.cnblogs.com/weishushubuyue/p/5994593.html

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP