通用json解析,根据json层级关系直接使用: 基节点.子节点.孙节点.x.x

小编 2026-06-05 阅读:2004 评论:0
package com.matol.utils;import java.io.InputStre...

package com.matol.utils;import java.io.InputStream;import java.util.ArrayList;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import java.util.Properties;import org.codehaus.jackson.map.ObjectMapper;/**  *  通用多层json递归解析。在没有Object对象,或是极度复杂的多级嵌套json,情况下以类的方式,直接获取结果。 *  支持String、Map、ArrayList、ArrayMap四种返回对象的数据获取 *  使用方式:根据json层级关系直接使用: 基节点.子节点.孙节点 *  @author ww */public class JsonUtil {	private static String jsonStr = "{"api":"2.1","message":["产品","tokken"],"request":{"ptype":"JK","tokken":"A#daDSFkiwi239sdls#dsd"},"response":{"status":{"statusCode":"500","statusMessage":["产品类型错误","tokken失效"]},"page":{"pageSize":"100","pageIndex":"1"},"data":{"ptitle":"all product lists","sDate":"2014-12-01","eDate":"2016-12-01","productList":[{"pid":"RA001","pname":"产品1"},{"pid":"RA002","pname":"产品2"}]}},"args":[{"tit":"RA001","val":"产品1"},{"tit":"RA002","val":"产品2"}]}";	private static ObjectMapper mapper = new ObjectMapper();		public static void main(String[] args) throws Exception {		//测试通过json获取Object对象		//Object obj = getObjectByJson(jsonStr,"response.data.ptitle",TypeEnum.string); //层级递归String		//System.out.println("API:"+obj.toString());				//Object obj = getObjectByJson(jsonStr,"response.page",TypeEnum.map);  //层级递归Map		//System.out.println("API:"+obj.toString()+((Map)obj).get("pageSize"));			}		/** 复杂嵌套Map转Json  */	public static String getJsonByObject(Object obj){		String str = "";		try {			str = mapper.writeValueAsString(obj);		} catch (Exception e) {			System.out.println("###[Error] getObjectToJson() "+e.getMessage());		}		return str;	}	/** 复杂嵌套Json层级展示  */	public static Object viewJsonTree(Object m){		if(m == null){ System.out.println("over...");return false;}		try {			Map mp = null;			List ls = null;			if(m instanceof Map || m instanceof LinkedHashMap){				mp = (LinkedHashMap)m;				for(Iterator ite = mp.entrySet().iterator(); ite.hasNext();){  					Map.Entry e = (Map.Entry) ite.next();  					if(e.getValue() instanceof String){						System.out.println("[String]"+e.getKey()+" | " + e.getValue());					}else if(e.getValue() instanceof LinkedHashMap){						System.out.println("{Map}"+ e.getKey()+" | "+e.getValue());						viewJsonTree((LinkedHashMap)e.getValue());					}else if(e.getValue() instanceof ArrayList){						System.out.println("[Array]"+ e.getKey()+" | "+e.getValue());						viewJsonTree((ArrayList)e.getValue());					}				}  				}			if(m instanceof List || m instanceof ArrayList){				ls = (ArrayList)m;				for(int i=0;i<ls.size();i++){					if(ls.get(i) instanceof LinkedHashMap){						viewJsonTree((LinkedHashMap)ls.get(i));					}else if(ls.get(i) instanceof ArrayList){						viewJsonTree((ArrayList)ls.get(i));					}					}			}				System.out.println();		} catch (Exception e) {			System.out.println("###[Error] viewJsonTree() "+e.getMessage());		}		return null;	}				private int i = 0;	/** 复杂嵌套Json获取Object数据  */	public Object getObjectByJson(String jsonStr,String argsPath,TypeEnum argsType){		if(argsPath == null || argsPath.equals("") || argsType == null){return null;}				Object obj = null;		try {			Map maps = mapper.readValue(jsonStr, Map.class);			//多层获取			if(argsPath.indexOf(".") >= 0){				//类型自适应				obj = getObject(maps,argsPath,argsType);			}else{ //第一层获取				if(argsType == TypeEnum.string){					obj = maps.get(argsPath).toString();				}else if(argsType == TypeEnum.map){					obj = (Map)maps.get(argsPath);				}else if(argsType == TypeEnum.arrayList){					obj = (List)maps.get(argsPath);				}else if(argsType == TypeEnum.arrayMap){					obj = (List<Map>)maps.get(argsPath);				}			}		} catch (Exception e) {			System.out.println("###[Error] getObjectByJson() "+e.getMessage());		}		i = 0;		return obj;	}	//递归获取object	private Object getObject(Object m,String key,TypeEnum type){		if(m == null){return null;}		Object o = null;		Map mp = null;		List ls = null;		try {			//对象层级递归遍历解析			if(m instanceof Map || m instanceof LinkedHashMap){				mp = (LinkedHashMap)m;				for(Iterator ite = mp.entrySet().iterator(); ite.hasNext();){  					Map.Entry e = (Map.Entry) ite.next();  										if(i<key.split("\.").length && e.getKey().equals(key.split("\.")[i])){						i++;						if(e.getValue() instanceof String){							if(i== key.split("\.").length){								o = e.getValue();								return o;							}						}else if(e.getValue() instanceof LinkedHashMap){							if(i== key.split("\.").length){								if(type == TypeEnum.map){									o = (LinkedHashMap)e.getValue();									return o;								}							}else{								o = getObject((LinkedHashMap)e.getValue(),key,type);							}							return o;						}else if(e.getValue() instanceof ArrayList){							if(i== key.split("\.").length){								if(type == TypeEnum.arrayList){									o = (ArrayList)e.getValue();									return o;								}								if(type == TypeEnum.arrayMap){									o = (ArrayList<Map>)e.getValue();									return o;								}							}else{								o = getObject((ArrayList)e.getValue(),key,type);							}							return o;						}					}				}  				}			//数组层级递归遍历解析			if(m instanceof List || m instanceof ArrayList){				ls = (ArrayList)m;				for(int i=0;i<ls.size();i++){					if(ls.get(i) instanceof LinkedHashMap){						if(i== key.split("\.").length){							if(type == TypeEnum.map){								o = (LinkedHashMap)ls.get(i);								return o;							}						}else{							o = getObject((LinkedHashMap)ls.get(i),key,type);						}						return o;					}else if(ls.get(i) instanceof ArrayList){						if(i== key.split("\.").length){							if(type == TypeEnum.arrayList){								o = (ArrayList)ls.get(i);								return o;							}							if(type == TypeEnum.arrayMap){								o = (ArrayList<Map>)ls.get(i);								return o;							}						}else{							o = getObject((ArrayList)ls.get(i),key,type);						}						return o;					}					}			}			} catch (Exception e) {			System.out.println("###[Error] getObject() "+e.getMessage());		}				return o;	}			/*	 * Json数据解析返回数据类型枚举	 */	public enum TypeEnum{		/** 单纯的键值对,通过key获取valus */        string,        /** 通过key获取到Map对象 */        map,        /** 通过key获取到ArrayList数组 */        arrayList,        /** 通过key获取到ArrayMap数组对象 */        arrayMap;    }}

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表