JSON序列化和反序列化调研文档

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}

注:测试是单线程测试,时间是毫秒(ms)  

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}]}

注:测试是单线程测试,时间是毫秒(ms)

2.3 简单Json数据反序列化

Json数据:

{"name":"abcdefg","age":25,"verified":false}

注:测试是单线程测试,时间是毫秒(ms)

2.4 Json数组数据反序列化

Json数据:

{"name":"abcdefg","age":25,"verified":false,"attrArray":[{"attrName":"attr1","value":"attribute1"},{"attrName":"attr2","value":123}]}

注:测试是单线程测试,时间是毫秒(ms)

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对象中提取出设备属性信息值的数组。这个过程为实际代码中的应用过程。

注:测试是单线程测试,时间是毫秒(ms)

2.6注意事项

主要对比Fastjson和Json-lib的使用。Fastjson和Json-lib的用法基本一致,有个别小地方不太一样,需要注意。

1.Fastjson序列化时会出现序列化后和序列化前的顺序错乱,虽然这不影响解析,但是会影响阅读,使用

JSONObject jsonObject = new JSONObject(true);

可以防止序列化顺序错乱,不过这仅限普通的json,不包含数组。

2.数组json序列化注意事项。如:

ArrayList attrArray = new ArrayList();

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().getClass()));

你可能感兴趣的:(JSON序列化和反序列化调研文档)