关于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= 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值