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

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"));

		//测试Objectz转json
		/*
		Map mapPars = new HashMap();
		mapPars.put("agentCode", "SH0001");
		mapPars.put("date", "2014-01-10");
		mapPars.put("url", "http://www.map.com/maps.jsp?tag=2");

		Map mapArgs = new HashMap();
		mapArgs.put("query", mapPars);

		Map maps = new HashMap();
		maps.put("request", mapArgs);
		maps.put("date", "2014-10-10");

		System.out.println(getObjectByJson(maps));
		*/

		//测试json层级递归显示效果
		Map maps = mapper.readValue(jsonStr, Map.class);
		viewJsonTree(maps);
	}

	/** 复杂嵌套Map转Json  */
	public static String getObjectByJson(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;
    }

}
时间: 2024-10-13 07:49:31

通用多层json递归解析,根据json层级关系直接使用: 基节点.子节点.孙节点。的相关文章

VBScript把json字符串解析成json对象的2个方法

这篇文章主要介绍了VBScript把json字符串解析成json对象的2个方法,本文通过MSScriptControl.ScriptControl和jscript实现,需要的朋友可以参考下 asp/vbscript将json字符解析为json对象的方法,如果asp使用jscript来编写服务器端代码操作json字符串就简单了,vbscript需要MSScriptControl.ScriptControl或者服务器端的jscript来作为中间体才行. vbscript将json字符解析为json对

JSON.parse()解析该json字符串,特殊字符串引起报错

主要的特殊字符:英文(半角)状态的 单引号 ‘ 双引号"  斜杠 \  反斜杠 /  and符号&   大于号 >  小于号 <   空格 9个特殊符号,可以采取录入的时候进行控制,禁止输入.或者在存入数据库的时候进行转义.或者从数据库取出时候转义.或者在页面进行转义替换等方案. 涉及到:特殊字符可能对  数据库代码 js造成错误.所以要考虑 数据库特殊字符     编写语言特殊字符   html页面特殊字符等. 方案一.存入数据库前对数据进行转义 json串中包含特殊的字符

【IOS开发之Objective-C】Json的解析 一

一.什么是Json? 关于Json的解释还是看百度百科是怎么解释的<百度百科---JSON>,这里还是比较专业的.首先我们已经知道了我们对象是什么也知道一些它的基本格式(百度百科有说明). 我们也来看看我保存在本地的一个Json文件,来具体分析一下它的格式. 先选择左上角的"Outline"模式,我们看见从左到右就是这么三列,分别是"Type"---类型,"Value"---值和"Name"---名字.有的&quo

JSON在线解析,新版本JSON在线解析

SOJSON,出了新版本的JSON在线解析,真的很好用,可以上下版本.左右版本.效果图如下.它的网址是:http://www.sojson.com/simple_json.html SOJSON集成了很多优秀的工具,它的网站:http://www.sojson.com/ JSON在线解析左右版本 JSON在线解析上下版本 JSON在线解析,JSON压缩 JSON在线解析,显示JSON数据类型 JSON在线解析,显示JSON 数组角标 赋值结果,测试Demo json

Oracle解析复杂json的方法

当前在Oracle数据库(11G之前的版本)解析json没有可以直接使用的系统方法,网上流传的PLSQL脚本大多也只可以解析结构较单一的json串,对于结构复杂的json串还无法解析.如此一来导致即便可以在PL/SQL中调用远程接口,但返回结果仍需传给前台js或java等其它代码进行处理,不太方便. 分析思路: 1.在PL/SQL中写json串,无需声明json对象,只需直接拼接成格式正确的json字符串即可,因此数据库对象间json串的传递完全可以用varchar2或clob来代替. 2.结构

web service json 数组解析

?? boolean workexpMark = true; // 美发师工作经历json数组解析 org.json.JSONObject jsonObject = new org.json.JSONObject( workExperience); String array = jsonObject.getString("workExperence"); org.json.JSONArray jsonArray = new org.json.JSONArray(array); int

几种不同的json格式解析

转连接: http://blog.csdn.net/whx405831799/article/details/42171191 内容很好 给服务端发送请求后,服务端会返回一连串的数据,这些数据在大部分情况下都是XML格式或者JSON格式.然后JSON相对XML来说解析相对方便一些,所以先说说JSON的解析. JSON的基本数据格式有这几种: 1.一个JSON对象--JSONObject {"name":"胡小威" , "age":20 , &qu

解决ajax请求返回Json无法解析&quot;\&quot;字符的问题

原因:获取身份证信息,涉及图片路径,存在“\”字符,导致Json解析错误 解决思路:将返回类型从"json"改成"text",此时返回的数据类型变成字符串,将字符串的"\"替换成"/",此时不存在Json格式错误的问题, 再调用Json.parse解析成Json格式 $.ajax({ type : "GET", //提交方式 url : "http://127.0.0.1:24010/ZKIDRO

10分钟掌握XML、JSON及其解析

引言 NOKIA 有句著名的广告语:“科技以人为本”.任何技术都是为了满足人的生产生活需要而产生的.具体到小小的一个手机,里面蕴含的技术也是浩如烟海,是几千年来人类科技的结晶,单个人穷其一生也未必能掌握其一角.不过个人一直认为基本的技术和思想是放之四海而皆准的,许多技术未必需要我们从头到尾再研究一遍,我们要做的就是站在巨人的肩膀上,利用其成果来为人们的需求服务. 随着移动互联网时代的大潮,越来越多的App不光是需要和网络服务器进行数据传输和交互,也需要和其他 App 进行数据传递.承担App与网