开发中有个需求就是从json字符串中读取值,用的阿里巴巴的那个
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
因为要个通用效果的,对象来回倒感觉有点麻烦,自己百度抄了抄改了改,写了一个工具来读取json中的值,先看下效果。
@Test
public void test(){
List list1 = getValListByKey("测试1",
"{\"data\":{\"id\":\"207\",\"family\":3,\"classification\":2,\"clientTypes\":[4],\"name\":\"0e6a80ba-21b2-41\",\"description\":null,\"content\":{\"userAdd\":0,\"userDelete\":1,\"userModify\":0,\"userPermissionChange\":1,\"groupAdd\":0,\"groupDelete\":1,\"groupMemberChange\":1},\"executiveMode\":{\"mode\":0,\"interval\":1,\"delay\":\"30\",\"time\":\"08:30\",\"weekday\":0,\"priority\":\"5\",\"networkTypes\":[\"0\"]},\"priority\":5,\"networkTypes\":[0],\"effectiveTime\":{\"date\":{\"begin\":\"2019-5-16\",\"end\":\"\"},\"week\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\"],\"time\":{\"type\":\"0\",\"quanta\":[]}},\"targetIds\":[\"161883097615302656\"],\"enabled\":true}}", "targetIds");
for(Object value:list1){
System.out.println(value);
}
System.out.println("-----------------------------");
List list2 = getValListByKey("测试2","{\"page\":{\"total\":3,\"pageSize\":10,\"pageNum\":0},\"data\":[{\"id\":\"1\",\"name\":\"低级\",\"grade\":1,\"mode\":\"0,1\",\"description\":\"低等级报警方式配置\",\"flag\":0,\"ctime\":\"2019-03-25T23:03:24\",\"utime\":\"2019-05-23T14:46:15\",\"cuser\":null,\"uuser\":1},{\"id\":\"2\",\"name\":\"中级\",\"grade\":2,\"mode\":\"1\",\"description\":\"中等级报警方式配置\",\"flag\":0,\"ctime\":\"2019-03-25T23:03:24\",\"utime\":\"2019-05-24T10:04:46\",\"cuser\":null,\"uuser\":1},{\"id\":\"3\",\"name\":\"高级\",\"grade\":3,\"mode\":\"0,1,2\",\"description\":\"高等级报警方式配置\",\"flag\":0,\"ctime\":\"2019-03-25T23:03:12\",\"utime\":\"2019-03-25T23:03:13\",\"cuser\":null,\"uuser\":1}]}","id");
for(Object value:list2){
System.out.println(value);
}
}
测试一的json,二就不贴了
{
"data": {
"id": "207",
"family": 3,
"classification": 2,
"clientTypes": [4],
"name": "0e6a80ba-21b2-41",
"description": null,
"content": {
"userAdd": 0,
"userDelete": 1,
"userModify": 0,
"userPermissionChange": 1,
"groupAdd": 0,
"groupDelete": 1,
"groupMemberChange": 1
},
"executiveMode": {
"mode": 0,
"interval": 1,
"delay": "30",
"time": "08:30",
"weekday": 0,
"priority": "5",
"networkTypes": ["0"]
},
"priority": 5,
"networkTypes": [0],
"effectiveTime": {
"date": {
"begin": "2019-5-16",
"end": ""
},
"week": ["1", "2", "3", "4", "5", "6", "7"],
"time": {
"type": "0",
"quanta": []
}
},
"targetIds": ["161883097615302656"],
"enabled": true
}
}
就是这么回事了,把里面键是指定值的都放到数组里头。代码一贴就完了,就是个递归遍历,常规的操作,也没什么优化之类的。
public static List getValListByKey(String url,String json,String name){
List resultlist = new ArrayList();
JSONObject jo = JSON.parseObject(json);
Object valByKey = getValByKey(jo, name,resultlist);
if(valByKey==null){
LOG.error(url+"并未从响应中获取到"+name);
}
return resultlist;
}
public static Object getValByKey(String url,String json,String name){
List resultlist = new ArrayList();
JSONObject jo = JSON.parseObject(json);
Object valByKey = getValByKey(jo, name,resultlist);
if(valByKey==null){
LOG.error(url+"并未从响应中获取到 "+name);
}
return valByKey;
}
/**
* 通过KEY查询VALUE
* @param obj
* @param name
* @return
*/
private static Object getValByKey(Object obj, String name,List resultlist) {
Map<String, Object> map = new HashMap<>();
getValForObj(obj, name, map,resultlist);
return map.get(name);
}
/**
* 查询值
* @param obj
* @param name
* @param map
*/
private static void getValForObj(Object obj, String name, Map<String, Object> map,List resultlist) {
if(obj instanceof JSONObject) {
getValForJObj((JSONObject)obj, name, map,resultlist);
}
if(obj instanceof JSONArray) {
getValForJArr((JSONArray)obj, name, map,resultlist);
}
}
/**
* 处理JsonObject 对象查值
* @param jobj
* @param name
* @param map
*/
private static void getValForJObj(JSONObject jobj, String name, Map<String, Object> map,List resultlist) {
for(Map.Entry<String, Object> entry : jobj.entrySet()) {
if(StringUtils.equals(entry.getKey(), name)) {
resultlist.add(entry.getValue());
map.put(entry.getKey(), entry.getValue());
}
getValForObj(entry.getValue(), name, map,resultlist);
}
}
/**
* 处理JsonAarray 对象查值
* @param arr
* @param name
* @param map
*/
private static void getValForJArr(JSONArray arr, String name, Map<String, Object> map,List resultlist) {
Iterator<Object> iner = arr.iterator();
while(iner.hasNext()) {
getValForObj(iner.next(), name, map,resultlist);
}
}