1 测试环境
操作系统:window 7
CPU:i5-5200U 2.20GHz
内存:8GB
运行环境:MyEclipse 2015
JDK:jdk1.8.0_92
2 序列化
2.1 简单数据序列化
原始数据:
String name = "abcdefg";
int age = 25;
boolean verified = false;
序列化后:
{"name":"abcdefg","age":25,"verified":false}
2.2 包含数组数据序列化
原始数据:
String name = "abcdefg";
int age = 25;
boolean verified = false;
封装后的数组为:[{"attrName":"attr1","value":"attribute1"},{"attrName":"attr2","value":123}]
序列化后:
{"name":"abcdefg","age":25,"verified":false,"attrArray":[{"attrName":"attr1","value":"attribute1"},{"attrName":"attr2","value":123}]}
2.3 简单Json数据反序列化
Json数据:
{"name":"abcdefg","age":25,"verified":false}
2.4 Json数组数据反序列化
Json数据:
{"name":"abcdefg","age":25,"verified":false,"attrArray":[{"attrName":"attr1","value":"attribute1"},{"attrName":"attr2","value":123}]}
2.5 实际例子(以获取设备属性信息值的结果进行json转换为例子)
输入数据:
String content = "{ \"cursor\" : { \"firstBatch\" : [ { \"_id\" : { \"$oid\" : \"5b20bf92e2237228c4f343e1\"} , \"keyhash\" : \"Bc1zh875nPEQkymQkzW3V6aj208=\" , \"devname\" : \"卷帘门-两号\" , \"writetime_devname\" : { \"$date\" : \"2018-06-13T09:51:51.703Z\"} , \"dev_head_protrait\" : \"5b20e2e98bec6dd0bb728ffc.jpg\" , \"writetime_dev_head_protrait\" : { \"$date\" : \"2018-06-13T09:25:03.573Z\"} , \"regist_time\" : { \"$date\" : \"2018-06-13T06:54:10.000Z\"} , \"writetime_regist_time\" : { \"$date\" : \"2018-06-13T06:54:10.917Z\"} , \"expire_time\" : { \"$date\" : \"2018-12-30T06:54:10.000Z\"} , \"writetime_expire_time\" : { \"$date\" : \"2018-06-13T06:54:10.918Z\"} , \"update_autofota\" : \"abcdefg\" , \"writetime_update_autofota\" : { \"$date\" : \"2018-06-26T08:49:06.186Z\"} , \"online\" : 1.0 , \"writetime_online\" : { \"$date\" : \"2018-06-27T05:46:21.491Z\"} , \"address\" : \"对方\" , \"writetime_address\" : { \"$date\" : \"2018-06-13T09:51:51.704Z\"} , \"wifissid@zot\" : \"zy5g\" , \"writetime_wifissid@zot\" : { \"$date\" : \"2018-06-27T07:24:38.252Z\"} , \"swver@zot\" : \"ZHUYUN_1.4.3\" , \"writetime_swver@zot\" : { \"$date\" : \"2018-06-26T06:30:33.537Z\"} , \"hwver@zot\" : \"ESP8266EX\" , \"writetime_hwver@zot\" : { \"$date\" : \"2018-06-26T06:30:33.123Z\"} , \"fota_update@zot\" : \"bin\" , \"writetime_fota_update@zot\" : { \"$date\" : \"2018-06-15T08:10:41.319Z\"}}] , \"id\" : 0 , \"ns\" : \"zot_device_2_1_1.t1_1_device_info\"} , \"ok\" : 1.0}";
输出数据:
String result= "{ \"_id\" : { \"$oid\" : \"5b20bf92e2237228c4f343e1\"} , \"keyhash\" : \"Bc1zh875nPEQkymQkzW3V6aj208=\" , \"devname\" : \"卷帘门-两号\" , \"writetime_devname\" : { \"$date\" : \"2018-06-13T09:51:51.703Z\"} , \"dev_head_protrait\" : \"5b20e2e98bec6dd0bb728ffc.jpg\" , \"writetime_dev_head_protrait\" : { \"$date\" : \"2018-06-13T09:25:03.573Z\"} , \"regist_time\" : { \"$date\" : \"2018-06-13T06:54:10.000Z\"} , \"writetime_regist_time\" : { \"$date\" : \"2018-06-13T06:54:10.917Z\"} , \"expire_time\" : { \"$date\" : \"2018-12-30T06:54:10.000Z\"} , \"writetime_expire_time\" : { \"$date\" : \"2018-06-13T06:54:10.918Z\"} , \"update_autofota\" : \"abcdefg\" , \"writetime_update_autofota\" : { \"$date\" : \"2018-06-26T08:49:06.186Z\"} , \"online\" : 1.0 , \"writetime_online\" : { \"$date\" : \"2018-06-27T05:46:21.491Z\"} , \"address\" : \"对方\" , \"writetime_address\" : { \"$date\" : \"2018-06-13T09:51:51.704Z\"} , \"wifissid@zot\" : \"zy5g\" , \"writetime_wifissid@zot\" : { \"$date\" : \"2018-06-27T07:24:38.252Z\"} , \"swver@zot\" : \"ZHUYUN_1.4.3\" , \"writetime_swver@zot\" : { \"$date\" : \"2018-06-26T06:30:33.537Z\"} , \"hwver@zot\" : \"ESP8266EX\" , \"writetime_hwver@zot\" : { \"$date\" : \"2018-06-26T06:30:33.123Z\"} , \"fota_update@zot\" : \"bin\" , \"writetime_fota_update@zot\" : { \"$date\" : \"2018-06-15T08:10:41.319Z\"}}";
注:进行了两次的json操作,第一次为将content字符串转换为json对象,第二次为从json对象中提取出设备属性信息值的数组。这个过程为实际代码中的应用过程。
2.6注意事项
主要对比Fastjson和Json-lib的使用。Fastjson和Json-lib的用法基本一致,有个别小地方不太一样,需要注意。
1.Fastjson序列化时会出现序列化后和序列化前的顺序错乱,虽然这不影响解析,但是会影响阅读,使用
JSONObject jsonObject = new JSONObject(true);
可以防止序列化顺序错乱,不过这仅限普通的json,不包含数组。
2.数组json序列化注意事项。如:
ArrayList<String> attrArray = new ArrayList<String>();
attrArray.add(...);
attrArray.add(...);
JSONObject jsonObject = new JSONObject(true);
jsonObject.put("attrArray", attrArray.toString());
如果是Json-lib,序列化后,值是{"attrArray":[{...},{...}]}
如果是Fastjson,序列化后,值是{"attrArray":"[{...},{...}]"}
会发现,Fastjson序列化后数组前会多了引号,为了去掉这个引号,需要将jsonObject.put("attrArray", attrArray.toString());改为jsonObject.put("attrArray", JSONArray.parseArray(attrArray.toString()));
此时就会去掉引号了,但是又发现数组里面的顺序也会错乱,为了去除错乱,可以使用jsonObject.put("attrArray", JSONArray.parseArray(attrArray.toString(), new LinkedHashMap<String,Object>().getClass()));