關於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());

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM