`
冰魄永峰
  • 浏览: 20133 次
  • 性别: Icon_minigender_1
  • 来自: 徐州
社区版块
存档分类
最新评论

Jackson第二篇【从JSON字符串中取值】

阅读更多

     第一篇咱们主要学习了实体与json的相互转换的问题,但是咱们需要的是数据 你转换18遍我取不到数据也是扯淡,那么今天咱们就一起学习一下如何从使用Jackson从Json字符串中取值。废话不说直接上代码(注意第一篇里面的方法我都移到JsonProcessUtil里面了方便使用 )。

    从Json字符串中取出指定节点的值

 

	public static void getValue(TestVo vo) throws Exception {
		// 准备工作 传入vo请参照第一篇里面的实体。此处不再重新贴上代码 浪费大家时间
		ObjectMapper mapper = JsonProcessUtil.getMapperInstance(false);
		String voJson = JsonProcessUtil.toJson(vo);
		JsonNode node = mapper.readTree(voJson);// 这里的JsonNode和XML里面的Node很像
		System.out.println("readValueFromJson>>>" + node.get("voName").toString());// 获取voName
		// 输出结果:readValueFromJson>>>一个容器而已
	}

    怎么样简单吧,但是这个作用不是很大啊!我想获取TestVo下面的Person的name的值 该怎么办呢?别着急,咱们走起!

 

	public static void getValue(TestVo vo) throws Exception {
		// 准备工作 传入vo请参照第一篇里面的实体。此处不再重新贴上代码 浪费大家时间
		ObjectMapper mapper = JsonProcessUtil.getMapperInstance(false);
		String voJson = JsonProcessUtil.toJson(vo);
		JsonNode node = mapper.readTree(voJson);// 这里的JsonNode和XML里面的Node很像
		node = node.get("pers");
		System.out.println("node是不是个集合:" + node.isArray());// 这个方法咱们后面会用到先让它给大家照个面
		for (int i = 0; i < node.size(); i++) {
			JsonNode childNode = node.get(i);
			System.out.println("readValueFromJson>>>" + childNode.get("name").toString());// 获取name
		}
		/*
		 * 输出结果 
		 * node是不是个集合:true
		 * readValueFromJson>>>张三 
		 * readValueFromJson>>>李四
		 * readValueFromJson>>>王二麻子
		 */
	}

 怎么样功能还行吧?如果这样你就满意了,那你也太容易满足了。现在我在项目中需要像xpath那样来查找某节点的值(不太了解xpath的童鞋别着急我以后会和大家一起学习下)。/a/b/c/d 这样找到某个节点的值。为了增加复杂度,我又给Person类里面增加 一个List<Person> childs;表示这个人的孩子那么咱们一往下需找的节点就多了……

  首先看下我准备的数据

 

{"voName":"一个容器而已","pers":[{"name":"张三","age":46,"childs":[{"name":"小张三1","age":20,"childs":null},{"name":"小张三2","age":17,"childs":null}]},{"name":"李四","age":29,"childs":[{"name":"小李四1","age":20,"childs":null}]},{"name":"王二麻子","age":23,"childs":null}]}

  张三:有两个孩子  李四:有一个孩子  王二麻子:没有孩子

  我现在要做的就是把所有的孩子找出来。

  废话不多说直接看代码

 

	public static void main(String[] args) throws Exception {
		// 准备数据
		List<Person> pers = new ArrayList<Person>();
		List<Person> childs = new ArrayList<Person>();
		Person p = new Person("张三", 46);
		childs.add(new Person("小张三1", 20));
		childs.add(new Person("小张三2", 17));
		p.setChilds(childs);
		pers.add(p);
		p = new Person("李四", 29);
		childs = new ArrayList<Person>();
		childs.add(new Person("小李四1", 20));
		p.setChilds(childs);
		pers.add(p);
		p = new Person("王二麻子", 23);
		pers.add(p);
		TestVo vo = new TestVo("一个容器而已", pers);
		// 实体转JSON字符串
		String json = beanToJson(vo);
		Object[] obj = readValueFromJson(json, "pers:childs:name").toArray();
		System.out.println(Arrays.toString(obj));
		// 输出结果:[小张三1, 小张三2, 小李四1]
	}

    好玩吧,接下来咱们就一起看下我这个readValueFormJson是如何实现的呢?

 

	/**
	 * 从json中读取tagPath处的值 tagPath用 :分隔
	 * 
	 * @param json
	 * @param tagPath
	 * @return
	 * @throws Exception
	 */
	public static List<String> readValueFromJson(String json, String tagPath) throws Exception {
		// 返回值
		List<String> value = new ArrayList<String>();
		if (CommonUtil.isEmpty(json) || (CommonUtil.isEmpty(tagPath))) {
			return value;
		}
		ObjectMapper mapper = CommonUtil.getMapperInstance(false);
		String[] path = tagPath.split(":");
		JsonNode node = mapper.readTree(json);
		getJsonValue(node, path, value, 1);
		return value;
	}

	public static void getJsonValue(JsonNode node, String[] path, List<String> values, int nextIndex) {
		if (CommonUtil.isEmpty(node)) {
			return;
		}
		// 是路径的最后就直接取值
		if (nextIndex == path.length) {
			if (node.isArray()) {
				for (int i = 0; i < node.size(); i++) {
					JsonNode child = node.get(i).get(path[nextIndex - 1]);
					if (CommonUtil.isEmpty(child)) {
						continue;
					}
					values.add(child.toString());
				}
			} else {
				JsonNode child = node.get(path[nextIndex - 1]);
				if (!CommonUtil.isEmpty(child)) {
					values.add(child.toString);
				}
			}
			return;
		}
		// 判断是Node下是集合还是一个节点
		node = node.get(path[nextIndex - 1]);
		if (node.isArray()) {
			for (int i = 0; i < node.size(); i++) {
				getJsonValue(node.get(i), path, values, nextIndex + 1);
			}
		} else {
			getJsonValue(node, path, values, nextIndex + 1);
		}
	}

     挺好吧,功能虽然实现了。但是童鞋们可能会对这个产生疑问,你他X的不是脱裤子放屁吗?先把Bean转换成Json再从Json中取值。效率低不说,而且还复杂。我直接通过get方法多好……如果你这样想了说明你是一个思考者!但是有种情况(本人在开发中遇到的)如果这个bean非常大 不同情况你需要的字段是不一样的 那你怎办? 根据情况判断if else if else if?如果有一百种情况呢?那不就累死了。所以在数据库里面配置不同业务情况从不同字段取值比较好,这样就会用到这种功能。另外附上:CommonUtil.isEmpty()方法

/**
	 * 判断对象是否为空
	 * 
	 * @param obj
	 * @return
	 */
	public static boolean isEmpty(Object obj) {
		boolean result = true;
		if (obj == null) {
			return true;
		}
		if (obj instanceof String) {
			result = (obj.toString().trim().length() == 0) || obj.toString().trim().equals("null");
		} else if (obj instanceof Collection) {
			result = ((Collection) obj).size() == 0;
		} else {
			result = ((obj == null) || (obj.toString().trim().length() < 1)) ? true : false;
		}
		return result;
	}

 注意:JsonNode 提供了很多种取值的方法,但是为了通用我选择了toString()因为getTextValue(),getIntValue()……一些方法只能返回指定类型的值,这样不能达到通用。而且有一种情况如果我想要的是整个节点下面所有子节点的值呢?如果使用上面的方法就没办法了,只能使用toString()这时候它返回的是整个json字符串。注意:toString()方法如果只返回某一个属性的值 如:name  而不是一整个大节点如:name,age,gender,那么它会在返回的字符串上加双引号,用的时候注意去掉开始结束的双引号。

今天就学习到这,下篇文章我将与大家一起探讨一下为什么 我创建一个ObjectMapper对象要搞的那么复杂!不直接new。

分享到:
评论
2 楼 gzqiandl 2013-03-15  
    
1 楼 gzqiandl 2013-03-15  
    

相关推荐

    jackson 对象json字符串数组集合互转

    在标题“Jackson对象json字符串数组集合互转”中,提到的核心概念是Jackson如何处理JSON字符串与Java集合(如List、Array等)之间的转换。下面将详细解释这一过程以及涉及的相关知识点。 1. JSON与Java对象映射: ...

    java对象转换为json字符串或字符串数组

    在实际应用中,我们可能需要查询JSON中的特定字段,或者验证JSON是否符合特定格式,这时可以使用JSONPath和JSONSchema。JSONPath类似于XPath,用于从JSON文档中提取数据;JSONSchema则定义了JSON数据的结构,用于...

    json字符串转化为list泛型

    在Java编程中,我们经常需要将JSON格式的数据转换为Java对象,这通常涉及到将JSON字符串转化为List泛型。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和...

    java中解析json字符串

    总结,Java中解析JSON字符串的方法多样,Jackson和Gson是最常用且功能强大的选项。根据项目的具体需求,可以选择适合的库来处理JSON数据,实现前端与后端的有效通信。在实际开发中,还需要注意处理可能出现的错误,...

    json字符串转换插件

    在Java开发中,处理JSON字符串通常需要借助第三方库,如Gson、Jackson或Fastjson等。本篇将深入探讨“json字符串转换插件”,重点介绍如何在项目中引入和使用这类工具。 首先,我们来理解JSON的基本结构。JSON基于...

    java解析Json字符串

    在Java中,我们可以使用多种库来解析Json字符串,包括Google的Gson库、Jackson库以及org.json库等。 1. Gson库: Gson是Google提供的一个开源库,用于在Java对象和JSON数据之间进行映射。使用Gson,你可以将Java...

    将string类型xml字符串转为json字符串

    本篇文章将详细讲解如何将string类型的XML字符串转换为JSON字符串,并介绍相关的技术知识。 首先,理解XML和JSON的基本结构是至关重要的。XML是一种树形结构的标记语言,通过标签来定义元素和属性,例如: ```xml ...

    json字符串转成 Map/List

    在Java中,将JSON字符串转换为Map或List是常见的操作,这在处理服务器返回的数据或者进行数据序列化时非常有用。 JSON字符串的结构主要包括对象(键值对的集合,用花括号{}包围)和数组(有序元素的集合,用方括号...

    使用json-lib将java对象转换成json字符串

    - `commons-collections-3.2.1.jar`:提供集合操作的扩展,如映射、过滤等,有助于处理JSON中的数组和对象结构。 - `commons-logging-1.1.1.jar`:提供日志接口,用于记录json-lib库在运行过程中的信息和错误。 -...

    Jackson实现Object对象与Json字符串的互转

    在本篇文章中,我们将深入探讨如何使用Jackson库实现Object对象与Json字符串的互转。 首先,让我们了解Jackson库的核心组件。Jackson库主要有三个核心模块: 1. `fasterxml.jackson.databind`:这是数据绑定模块,...

    解析Json字符串直接转换为对象(包括多层List集合 嵌套)所用jar包

    接下来,我们创建对应的Java类来表示JSON中的结构。假设我们有一个如下的JSON字符串: ```json { "name": "John", "age": 30, "address": { "street": "123 Main St", "city": "New York" }, "friends": [ ...

    复杂的json字符串解析(真实案例)

    例如,JSON中的数值被误写成字符串,或者期望的对象变成了数组。 2. **非标准JSON格式**:某些情况下,JSON可能会包含非标准的JSON语法,如额外的逗号或不正确的引号。在这种情况下,Gson可能会抛出...

    Java Web程序实现返回JSON字符串的方法总结

    Java Web 程序实现返回 JSON 字符串的方法总结是 Java Web 开发中非常重要的一部分。随着 JSON 数据交换格式的广泛应用,Java Web 程序员需要学习如何将 Java 对象转换为 JSON 字符串。在本文中,我们将总结 Java ...

    net.sf.json.JSONObject实现Object对象与Json字符串的互转

    是开源库Apache Commons Lang中的一个类,它提供了解决Java对象与JSON字符串之间转换的功能。这篇博客文章"net.sf.json.JSONObject实现Object对象与Json字符串的互转"深入探讨了如何使用`JSONObject`来处理这种转换...

    java验证字符串是否符合json格式

    在Java中,我们可以利用现有的库如Jackson、Gson或org.json等来实现JSON字符串的验证。这里以`org.json`库为例,给出一个简单的验证示例: ```java import org.json.JSONObject; import org.json.JSONTokener; ...

    android发送post请求获取json字符串

    本篇文章将深入探讨如何在Android应用中发送POST请求,并解析返回的JSON字符串。 首先,我们要理解POST请求的基本原理。POST请求是HTTP协议中的一个方法,用于向服务器提交数据,这些数据会附在请求体中。在Android...

    json字符串实体bean或者List互转(gson和jackson,支持泛型)

    json字符串实体bean或者List互转(gson和jackson,支持泛型),支持json的格式化,所需要的包在代码也有说明。还有少的可以告知我,谢谢

    利用java反射将json字符串转成对象.zip

    在给定的“利用java反射将json字符串转成对象”的主题中,我们将深入探讨如何借助反射机制将JSON字符串转换为Java对象。 首先,我们需要了解JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人...

    JSON字符串和java对象的相互转换

    2. 使用Gson将JSON字符串转化为Java对象: ```java String jsonString = "{\"name\":\"John\", \"age\":30}"; Gson gson = new Gson(); User user = gson.fromJson(jsonString, User.class); ``` JSON Java对象转...

Global site tag (gtag.js) - Google Analytics