目录
1.Json介绍
首先简单介绍下json(JavaScript Object Notation),是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成,JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。示例如下:
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
-
对象表示为键值对
-
数据由逗号分隔
-
花括号保存对象
-
方括号保存数组
完成json示例如下:
[
{
"JsonNode": {
"根据key1获取下一个商家编号": [
{
"key1": "value1"
},
{
"code": 0,
"msg": "success"
}
],
"根据key1获取下一个商家编号,key1不存在": [
{
"key1": "value11212"
},
{
"code": 6001,
"msg": "Part Key 池中无数据"
}
]
},
"JsonNode": {
"添加新的商家编号": [
{
"key1": "value1",
"key2": "10086"
},
{
"code": 0,
"msg": "success"
}
],
"添加新的商家编号,key1不存在": [
{
"key1": "value112120025",
"key2": "10086"
},
{
"code": 500,
"msg": "系统异常"
}
]
}
}
]
2.JsonObject与JsonArray
JSONObject的数据是用 { } 来表示,如str
String str = "{ \"id\" : \"123\", \"name\" : \"zhangsan\", \"title\" : \"test\", \"content\" : null }"
JSONArray,由JSONObject构成的数组,用 [ { } , { } , ...... , { } ] 来表示
String strarry = "[ { \"id\" : \"123\", \"name\" : \"zhangsan\", \"title\" : \"test\" }, {\"content\" : null , \"beginTime\" : 1398873600000, \"endTime\":0 } ] ";
2.1 将String转jsonObjet
两种方式(fastjson与)分别表达如下
//net.sf.json
JSONObject jsonObject = JSONObject.fromObject(str);
LOGGER.info("jsonObject: {}"+jsonObject, jsonObject.getClass().getName());
//fastjson
JSONObject jsonObject1 = JSONObject.parseObject(str);
LOGGER.info("jsonObject1 {}: "+jsonObject1, jsonObject1.getClass().getName());
[INFO ] 2019-06-08 18:20:37,794 method:com.qa.utils.JsonDemo.JsonFile(JsonDemo.java:40)
jsonObject: net.sf.json.JSONObject{"id":"123","courseID":"huangt-test","title":"提交作业","content":null}
[INFO ] 2019-06-08 18:20:37,880 method:com.qa.utils.JsonDemo.JsonFile(JsonDemo.java:43)
jsonObject1 com.alibaba.fastjson.JSONObject: {"id":"123","title":"提交作业","courseID":"huangt-test"}
2.2 String转JsonArray
//net.sf.json
JSONArray jsonArray = JSONArray.fromObject(strarry2);
LOGGER.info("jsonArray: {}"+jsonArray, jsonArray.getClass().getName());
//fastjson
JSONArray jsonArray1 = JSONArray.parseArray(strarry2);
LOGGER.info("jsonArray1: {}"+jsonArray1, jsonArray1.getClass().getName());
[INFO ] 2019-06-08 18:26:54,654 method:com.qa.utils.JsonDemo.JsonFile(JsonDemo.java:46)
jsonArray: net.sf.json.JSONArray[{"id":"123","courseID":"huangt-test","title":"提交作业"},{"content":null,"beginTime":1398873600000,"endTime":0}]
[INFO ] 2019-06-08 18:26:54,748 method:com.qa.utils.JsonDemo.JsonFile(JsonDemo.java:49)
jsonArray1: com.alibaba.fastjson.JSONArray[{"id":"123","title":"提交作业","courseID":"huangt-test"},{"beginTime":1398873600000,"endTime":0}]
2.3 jsonarry转jsonObject
遍历jsonArray
int size = jsonArray.size();
JSONObject jsoncontext = null;
for (int i = 0; i < size; i++) {
// 遍历 jsonarray 数组,把每一个对象转成 json 对象
JSONObject jsonObject = jsonArray.getJSONObject(i);
//JSONObject jsonObject1 = (JSONObject) jsonArray.get(i);
jsoncontext = jsonObject.getJSONObject(stringName);
}
遍历jsonObject
Iterator<Map.Entry<String, Object>> iterable = jsonObject1.entrySet().iterator();
while (iterable.hasNext()) {
String key = iterable.next().getKey();
String value = jsonObject1.getString(key);
LOGGER.info("key="+key+" ,value="+value);
}
2.4 map转JsonObject
net.sf.json可以直接 通过fromObject方法,将Map集合转为JsonObject,fastjson需要先将map转为json,再通过parseObject方法转为JsonObject。无论通过哪种包转的,都可以通过keySet遍历,以数组形式输出键值。
LinkedHashMap<String, Object> jsonNode = new LinkedHashMap<>();
//获得map的迭代器,用作遍历map中的每一个键值对。Iterator是迭代器
Iterator<Map.Entry<String, Object>> iterator = jsoncontext != null ? jsoncontext.entrySet().iterator() : null;
while (Objects.requireNonNull(iterator).hasNext()){
String key = iterator.next().getKey();
Object value = jsoncontext.get(key);
System.out.println("key="+key+" value="+value);
jsonNode.put(key, value);
}
//将HashMap转为jsonObject字符串
JSONObject jsonObject = JSONObject.fromObject(jsonNode);
com.alibaba.fastjson.JSONObject jsonObject1 = com.alibaba.fastjson.JSONObject.parseObject(JSON.toJSONString(jsonNode),Feature.OrderedField);
LOGGER.info("net.sf.json: map转为JSONObject"+jsonObject);
LOGGER.info("jsonObject的键:"+jsonObject.keySet());
LOGGER.info("fastjson: map转为com.alibaba.fastjson.JSONObject "+jsonObject1);
LOGGER.info("jsonObject的键:"+jsonObject1.keySet());
fastjson获取的键,默认是无序的,可以通过自带的字段指定排序:Feature.OrderedField,new JsonObject时,也可以指定有序
//传入true则内部使用LinkedHashMap而非HashMap,实现转toString时key保持put入的顺序
com.alibaba.fastjson.JSONObject json = new com.alibaba.fastjson.JSONObject(true);
[INFO ] 2019-06-09 23:36:53,804 method:com.qa.utils.JsonDemo.getString(JsonDemo.java:52)
net.sf.json: map转为JSONObject{"根据appkey获取下一个商家编号":[{"appkey":"autorun__qa"},{"code":0,"msg":"success"}],"根据appkey获取下一个商家编号,appkey不存在":[{"appkey":"autorun__qa1212"},{"code":6001,"msg":"Part Key 池中无数据"}],"根据gg,appkey不存在":[{"appkey":"autorun__qa1212"},{"code":6001,"msg":"Part Key 池中无数据"}]}
[INFO ] 2019-06-09 23:36:53,806 method:com.qa.utils.JsonDemo.getString(JsonDemo.java:53)
jsonObject的键:[根据appkey获取下一个商家编号, 根据appkey获取下一个商家编号,appkey不存在, 根据gg,appkey不存在]
[INFO ] 2019-06-09 23:36:53,807 method:com.qa.utils.JsonDemo.getString(JsonDemo.java:54)
fastjson: map转为com.alibaba.fastjson.JSONObject {"根据appkey获取下一个商家编号":[{"appkey":"autorun__qa"},{"msg":"success","code":0}],"根据gg,appkey不存在":[{"appkey":"autorun__qa1212"},{"msg":"Part Key 池中无数据","code":6001}],"根据appkey获取下一个商家编号,appkey不存在":[{"appkey":"autorun__qa1212"},{"msg":"Part Key 池中无数据","code":6001}]}
[INFO ] 2019-06-09 23:36:53,808 method:com.qa.utils.JsonDemo.getString(JsonDemo.java:55)
jsonObject的键:[根据appkey获取下一个商家编号, 根据gg,appkey不存在, 根据appkey获取下一个商家编号,appkey不存在]
2.5 JsonObject转map
com.alibaba.fastjson.JSONObject jsonObject1 = com.alibaba.fastjson.JSONObject.parseObject(JSON.toJSONString(jsonNode), Feature.OrderedField);
Map<String, Object> map = com.alibaba.fastjson.JSONObject.toJavaObject(jsonObject1, Map.class);
LOGGER.info("json transfer to map {}", map);
LOGGER.info("json transfer to map {}", map.getClass().getName());
[INFO ] 2019-06-10 00:17:41,538 method:com.qa.utils.JsonDemo.getString(JsonDemo.java:60)
json transfer to map {"根据appkey获取下一个商家编号":[{"appkey":"autorun__qa"},{"code":0,"msg":"success"}],"根据appkey获取下一个商家编号,appkey不存在":[{"appkey":"autorun__qa1212"},{"code":6001,"msg":"Part Key 池中无数据"}],"根据gg,appkey不存在":[{"appkey":"autorun__qa1212"},{"code":6001,"msg":"Part Key 池中无数据"}]}
[INFO ] 2019-06-10 00:17:41,538 method:com.qa.utils.JsonDemo.getString(JsonDemo.java:61)
json transfer to map com.alibaba.fastjson.JSONObject
2.6遍历jsonobject
# 这里跟Map一样
for (Map.Entry entry : jsonObject.entrySet()) {
if (key.equals(entry.getKey())) {
return entry.getValue().toString();
}
}
参考:https://www.cnblogs.com/xuanbo/p/6913585.html
复杂json的解析