JSON读取值

  开发中有个需求就是从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);
        }
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值