关于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());

 

posted @ 2016-10-24 21:05  WeiForNote  阅读(5691)  评论(0编辑  收藏  举报