JAVA递归JSON取值

网上查了不少都是JS 的,JAVA写得也少,正好要用到,自己写了一个,这个类的缺点就是一个JSON如果有多个KEY重复
会取最后一个值得返回,当然可以优化下,这样需要搞个规则解析,可以进一步优化,后续会放出,直接放一把取值代码
思路也很简单,递归而已

网上找的一个相对复杂的JSON

{
	"HeWeather6": [{
		"basic": {
			"cid": "CN101010100",
			"location": "北京",
			"parent_city": "北京",
			"admin_area": "北京",
			"cnty": "中国",
			"lat": "39.90498734",
			"lon": "116.40528870",
			"tz": "8.0"
		},
		"daily_forecast": [{
			"cond_code_d": "103",
			"cond_code_n": "101",
			"cond_txt_d": "晴间多云",
			"cond_txt_n": "多云",
			"date": "2017-10-26",
			"hum": "57",
			"pcpn": "0.0",
			"pop": "0",
			"pres": "1020",
			"tmp_max": "16",
			"tmp_min": "8",
			"uv_index": "3",
			"vis": "16",
			"wind_deg": "0",
			"wind_dir": "无持续风向",
			"wind_sc": "微风",
			"wind_spd": "5"
		}, {
			"cond_code_d": "101",
			"cond_code_n": "501",
			"cond_txt_d": "多云",
			"cond_txt_n": "雾",
			"date": "2017-10-27",
			"hum": "56",
			"pcpn": "0.0",
			"pop": "0",
			"pres": "1018",
			"tmp_max": "18",
			"tmp_min": "9",
			"uv_index": "3",
			"vis": "20",
			"wind_deg": "187",
			"wind_dir": "南风",
			"wind_sc": "微风",
			"wind_spd": "6"
		}, {
			"cond_code_d": "101",
			"cond_code_n": "101",
			"cond_txt_d": "多云",
			"cond_txt_n": "多云",
			"date": "2017-10-28",
			"hum": "26",
			"pcpn": "0.0",
			"pop": "0",
			"pres": "1029",
			"tmp_max": "17",
			"tmp_min": "5",
			"uv_index": "2",
			"vis": "20",
			"wind_deg": "2",
			"wind_dir": "北风",
			"wind_sc": "3-4",
			"wind_spd": "19"
		}],
		"status": "ok",
		"update": {
			"loc": "2017-10-26 23:09",
			"utc": "2017-10-26 15:09"
		}
	}]
}
package com.lambdaj.json;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

public class JMain {
	
	/**
	 * 主函数
	 * @param args
	 */
	public static void main(String[] args) {
		String str = "{\"HeWeather6\":[{\"basic\":{\"cid\":\"CN101010100\",\"location\":\"北京\",\"parent_city\":\"北京\",\"admin_area\":\"北京\",\"cnty\":\"中国\",\"lat\":\"39.90498734\",\"lon\":\"116.40528870\",\"tz\":\"8.0\"},\"daily_forecast\":[{\"cond_code_d\":\"103\",\"cond_code_n\":\"101\",\"cond_txt_d\":\"晴间多云\",\"cond_txt_n\":\"多云\",\"date\":\"2017-10-26\",\"hum\":\"57\",\"pcpn\":\"0.0\",\"pop\":\"0\",\"pres\":\"1020\",\"tmp_max\":\"16\",\"tmp_min\":\"8\",\"uv_index\":\"3\",\"vis\":\"16\",\"wind_deg\":\"0\",\"wind_dir\":\"无持续风向\",\"wind_sc\":\"微风\",\"wind_spd\":\"5\"},{\"cond_code_d\":\"101\",\"cond_code_n\":\"501\",\"cond_txt_d\":\"多云\",\"cond_txt_n\":\"雾\",\"date\":\"2017-10-27\",\"hum\":\"56\",\"pcpn\":\"0.0\",\"pop\":\"0\",\"pres\":\"1018\",\"tmp_max\":\"18\",\"tmp_min\":\"9\",\"uv_index\":\"3\",\"vis\":\"20\",\"wind_deg\":\"187\",\"wind_dir\":\"南风\",\"wind_sc\":\"微风\",\"wind_spd\":\"6\"},{\"cond_code_d\":\"101\",\"cond_code_n\":\"101\",\"cond_txt_d\":\"多云\",\"cond_txt_n\":\"多云\",\"date\":\"2017-10-28\",\"hum\":\"26\",\"pcpn\":\"0.0\",\"pop\":\"0\",\"pres\":\"1029\",\"tmp_max\":\"17\",\"tmp_min\":\"5\",\"uv_index\":\"2\",\"vis\":\"20\",\"wind_deg\":\"2\",\"wind_dir\":\"北风\",\"wind_sc\":\"3-4\",\"wind_spd\":\"19\"}],\"status\":\"ok\",\"update\":{\"loc\":\"2017-10-26 23:09\",\"utc\":\"2017-10-26 15:09\"}}]}";
		JSONObject jo = JSON.parseObject(str);
		System.out.println(getValByKey(jo, "lon"));
	}
	
	/**
	 * 通过KEY查询VALUE
	 * @param obj
	 * @param name
	 * @return
	 */
	public static Object getValByKey(Object obj, String name) {
		Map<String, Object> map = new HashMap<>();
		getValForObj(obj, name, map);
		return map.get(name);	
	}
	
	/**
	 * 查询值
	 * @param obj
	 * @param name
	 * @param map
	 */
	public static void getValForObj(Object obj, String name, Map<String, Object> map) {
		if(obj instanceof JSONObject) {
			getValForJObj((JSONObject)obj, name, map);
		}
		if(obj instanceof JSONArray) {
			getValForJArr((JSONArray)obj, name, map);
		}
	}
	
	/**
	 * 处理JsonObject 对象查值
	 * @param jobj
	 * @param name
	 * @param map
	 */
	public static void getValForJObj(JSONObject jobj, String name, Map<String, Object> map) {
		for(Map.Entry<String, Object> entry : jobj.entrySet()) {
//			System.out.println("key:"+entry.getKey()+"|val:"+entry.getValue()+"|cls:"+entry.getValue().getClass());
			if(StringUtils.equals(entry.getKey(), name)) {
				map.put(entry.getKey(), entry.getValue());
			}
			getValForObj(entry.getValue(), name, map);
		}
	}
	
	/**
	 * 处理JsonAarray 对象查值
	 * @param arr
	 * @param name
	 * @param map
	 */
	public static void getValForJArr(JSONArray arr, String name, Map<String, Object> map) {
		Iterator<Object> iner = arr.iterator();
		while(iner.hasNext()) {
			getValForObj(iner.next(), name, map);
		}
	}

}

显示结果:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值