最近对一个大对象转成json字符串存入redis,在开发过程中发现比较有意思的,发现对象中的属性类型是List类型的,无法转成字符串,再次比较一下几个json转船的工具包。
1、最常用的阿里巴巴家的fastjson--JSONObject方式
2、伟创力(Flextronics)家的flexjson的JSONSerializer方式
3、谷歌家的Gson方式
当处理层级关系比较浅的结构时,以上三家是都没有问题,但是当层级关系比较复杂时,譬如A对象里有B对象,List<C>对象,B对象里有List<D>等等就会出现json串丢失的现象。
上代码和运行结果:
List<String> testList=new ArrayList<>();
testList.add("张三");
testList.add("张三1");
testList.add("张三2");
testList.add("张三3");
testList.add("张三4");
AuctionObservable auctionObservable=new AuctionObservable();
auctionObservable.setNotifyObs(testList);
String jsonObjectStr=JSONObject.toJSONString(auctionObservable);
System.out.println("JSONObject转化的json串"+jsonObjectStr);
Gson gson =new Gson();
String gsonStr = gson.toJson(auctionObservable);
System.out.println("Gson转化的json串"+gsonStr);
String objStr = JsonGenerator.serializerObject(auctionObservable);
System.out.println("JsonGenerator转化的json串"+objStr);
运行结果
JSONObject转化的json串{"clientSessionId":{},"notifyObs":[],"obs":[],"preVersion":0,"subtractLadderList":[500,1000,5000,10000,50000,100000,500000,1000000],"version":0}
Gson转化的json串{"preVersion":0,"version":0,"notifyObs":["张三","张三1","张三2","张三3","张三4"],"clientSessionId":{},"changed":false,"obs":[]}
JsonGenerator转化的json串{"auctionData":null,"auctionInfoData":null,"clientSessionId":{},"connectCheck":null,"currency":null,"ladderSet":null,"liveMsg":null,"operatorSessionId":null,"preVersion":0,"sessionData":null,"type":null,"version":0}
通过以上比较我们可以看出JSONObject和JsonGenerator对于非空的list并未转换,只有Gson对含有数据的notifyObs进行了json数据转换为json串。