在使用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());