文档章节

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

后海
 后海
发布于 2015/02/05 15:23
字数 915
阅读 7.6K
收藏 12
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;
    }

}

 

 

© 著作权归作者所有

后海

后海

粉丝 33
博文 48
码字总数 25623
作品 2
闵行
后端工程师
私信 提问
ASP.Net Core 2.0 获取Json和Xml格式的配置信息

本篇将和大家分享的是:如何获取Json和Xml格式的配置信息,主要介绍的是Configuration扩展方法的使用,因为netcore的web应用在Startup中已经默认嵌入appsettings.json文件的配置信息,故而我...

AIU_GS
2017/10/26
45
0
java解析json字符串详解(两种方法)

一、使用JSONObject来解析JSON数据 官方提供的,所以不需要导入第三方jar包;直接上代码,如下 步骤解读:      定义一个JSON数组,用于将服务器返回的数据传入到一个JSONArray对象中;...

architect刘源源
2018/11/07
605
0
SQLServer · 特性分析 · XML与JSON应用比较

背景 SQL Server是一种强大的数据库引擎,不仅性能卓越,稳定,功能还很强大,SQL Server 2016中已经支持JSON。这让我想到以前工作中经常使用的SQL XML,也对比一下他们几个关键领域的应用方...

阿里云RDS-数据库内核组
2016/07/07
0
0
用 JSON 表现树的结构兼谈队列、堆栈的练习(一)

K/V 与 Array 接触 JSON 的人都知道,JSON 可通过 K/V(Key/Value) 结构很直观地表现一棵树,因为 V 可以“包含”另外一个 K/V 从而不断嵌套下去形成“树状”的结构。但 V 不一定必须为另外...

zhangxin09
2017/08/02
0
0
iOS 效率工具:自动生成 Model 文件

GitHub 地址:YBModelFile 一句代码自动生成 Model 文件,拖入工程既能使用。 前言 当一个网络数据比较复杂时,往往需要一些功夫来创建对应的数据模型,笔者正是苦于手动创建 Model 痛苦,决...

indulge_in
2019/03/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用Simple-Html-Dom解析HTML文件

要想获得网页源码里的指定内容需要用到正则表达式!正则表达式,让我猝不及防,因为之前没有接触过,用起来非常的吃力! 在Java中,有大牛封装好的库,我使用的是Jsoup。将Jsuop的Jar包引入项...

owenzhang24
4分钟前
3
0
在PHP中转换日期格式

我正在尝试将日期从yyyy-mm-dd为dd-mm-yyyy (但在SQL中不是); 但是我不知道date函数如何需要时间戳,并且我无法从该字符串获取时间戳。 这怎么可能? #1楼 如果您想避免strtotime转换(例...

技术盛宴
6分钟前
9
0
mina服务端检测客户端心跳实例

服务端代码 public class MyServer { /** 30秒后超时 */ private static final int IDELTIMEOUT = 30; /** 15秒发送一次心跳包 */ private static final int HEARTBEATRATE = 15; /** 心跳包......

whoisliang
8分钟前
22
0
mac几个知识点。

用mac必须知道下面几个知识。 复制、粘贴。 command + c 复制, command+option+v 粘贴。 剪切。 首先选中要剪切的文件command + c 复制,然后在要粘贴的目录 command+option+v 粘贴。 bmg文...

王坤charlie
8分钟前
18
0
ActiveMQ学习之Spring整合ActiveMQ------>监听配置

一、pom <dependencies> <!--activemq--> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.15.9<......

冥焱
14分钟前
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部