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

来源:http://blog.csdn.net/songyongfeng/article/details/6932674

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

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

	public static void getValue(TestVo vo) throws Exception {   // 准备工作 传入vo请参照第一篇里面的实体。此处不再重新贴上代码 浪费大家时间   ObjectMapper mapper = CommonUtil.getMapperInstance(false);   String voJson = CommonUtil.beanToJson(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 getValue2(TestVo vo) throws Exception {   // 准备工作 传入vo请参照第一篇里面的实体。此处不再重新贴上代码 浪费大家时间   ObjectMapper mapper = CommonUtil.getMapperInstance(false);   String voJson = CommonUtil.beanToJson(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 = CommonUtil.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;}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

李开复:明年会有一批AI公司倒闭

来源&#xff1a;公众号黑智概要&#xff1a;在北美的四大AI巨头公司中&#xff0c;李开复的总结是&#xff1a;Google有大牛优势&#xff1b;Facebook做得更深&#xff0c;但没有平台化意识&#xff1b;微软在试着聚拢自己的实力&#xff1b;“四大AI公司中&#xff0c;有3家不…

java 多线程统计质数,Java 七 多线程计算某个范围内的质数

Java 7 多线程计算某个范围内的质数不多说了,看代码通用类package java7.concurrency.math;/*** This class generates prime numbers until is interrupted*/public class PrimeGenerator extends Thread{private long numberRange;public PrimeGenerator(long numberRange) {…

相互引用的初始化过程

问题说明&#xff1a; 两个对象A初始化时候会引用B&#xff0c;B 在初始化时会引用A&#xff0c;这个过程是怎么完成的&#xff1f; 代码示例&#xff1a; /*** 相互关联引用的初始化* author administrator**/ public class Interdependent {private TestClass test new Tes…

matlab+stm32通讯,matlab与stm32之间利用串口通信记录

1、涉及到的函数serial,fopen,fclose,instrfindall,instrhwinfo,fprintf,fscanf,fwrite,fread,isempty1.1 串口函数scom serial(com6,BaudRate,115200,BytesAvailableFcnMode,byte);fopen(scom);.fclose(scom);或者对串口属性单独设置&#xff0c;如下&#xff1a;scom seria…

德勤预测2018年9大科技趋势:AR走进普通用户,直播仍然是王道

来源&#xff1a;腾讯科技编辑&#xff1a;Jennie“我们眼下正处在一个临界点&#xff0c;即机器学习将在企业市场加速普及&#xff0c;从而推动改进企业运营&#xff0c;让企业作出更好的决策&#xff0c;并提供增强或全新的产品和服务。”——德勤副总裁保罗萨罗米据外媒报道…

Tomcat学习笔记(一)

HTTP 请求 一个HTTP请求包括三个组成部分&#xff1a;  方法—统一资源标识符(URI)—协议/版本  请求的头部  主体内容 下面是一个HTTP请求的例子&#xff1a; POST /examples/default.jsp HTTP/1.1 Accept: text/plain; text/html Accept-Language: en-gb Connection: K…

谷歌人工智能检索开普勒望远镜数据后,找到了“迷你太阳系”

“开普勒&#xff0d;90”和太阳系一样拥有八大行星 本文图片均来自 NASA来源&#xff1a;澎湃新闻概要&#xff1a;当地时间12月15日&#xff0c;美国国家航空航天局NASA宣布在“行星猎手”开普勒望远镜的数据库中找到了恒星“开普勒&#xff0d;90”周围的第八颗行星&#xf…

php去除所有标点符号的方法,php如何去除标点符号

php去除标点符号的方法&#xff1a;首先创建一个PHP示例文件&#xff1b;然后通过正则表达式“preg_replace($pattern, , $str);”删除字符串中的中英文标点符号即可。推荐&#xff1a;《PHP视频教程》php正则&#xff0c;删除字符串中的中英文标点符号原理很简单&#xff0c;…

JAVA监听器原理

来源&#xff1a;http://www.cnblogs.com/hulitut/archive/2012/03/27/2420414.html Java 最新的事件处理方法是基于授权事件模型 事件源生成事件并将其发送至一个或多个监听器监听器简单地等待&#xff0c;直到它收到一个事件。一旦事件被接受&#xff0c;监听器将处理这些事…

美国的人工智能企业在研发哪些有趣的AI产品?

来源&#xff1a;亿欧概要&#xff1a;本文盘点了美国AI企业的有趣产品&#xff0c;或许能给国内AI创业者和投资人有所启发。同样是AI创业&#xff0c;国内外的打法显然不同。在国内&#xff0c;大部分AI创业公司都在拼主赛道&#xff0c;比如无人驾驶、AI安防、AI医疗、AI教育…

mysql创建反弹函数,MySql创建函数

首先需要查看一下创建函数的功能是否开启&#xff1a;mysql> show variables like %func%;------------------------------------------------| Variable_name | Value |------------------------------------------------| log_bin_trust_funct…

Java技术回顾之JNDI--实例

一、JNDI在Java EE中的应用JNDI 技术是Java EE规范中的一个重要“幕后”角色&#xff0c;它为Java EE容器、组件提供者和应用程序之间提供了桥梁作用&#xff1a;Java EE容器同时扮演JNDI提供者角色&#xff0c;组件提供者将某个服务的具体实现部署到容器上&#xff0c;应用程序…

【观点】智能制造:新时代智能产业革命的基石|王飞跃

来源&#xff1a; 中国科学院自动化研究所概要&#xff1a;以新的理念和新的技术发展新时期的智能制造科技&#xff0c;创新智能产业革命&#xff0c;将是中国从制造大国到制造强国&#xff0c;进而从世界大国到世界强国的必由之道和开路先锋。实体经济&#xff0c;特别是以制造…

matlab连续型随机变量,matlab连续型随机变量的分布.doc

matlab连续型随机变量的分布.doc 连续型随机变量的分布及其数字特征一、基本概念设随机变量X的分布函数为F(x)&#xff0c;若存在非负函数f(x)&#xff0c;使对任意实数x&#xff0c;有≤X{Pxd}则称X为连续型随机变量&#xff0c;并称f(x)为X的概率密度&#xff0c;它满…

Java技术回顾之JNDI--命名和目录服务基本概念

命名服务的相关概念&#xff1a; Naming Service 命名服务 命名服务将名称和对象进行关联&#xff0c;提供通过名称找到对象的操作。 例如&#xff1a;DNS系统将计算机名和IP地址进行关联。文件系统将文件名和文件句柄进行关联等等。 Name 名称 要在命名系统中查找对象&…

php phpass,ass.php · ciweiin/海洋cms 海洋影视管理系统 - 免费开源PHP - Gitee.com

// search jsonp server v1.2 form seacms by nohacks.cnrequire_once("include/common.php");require_once(sea_INC."/main.class.php");//参数过滤$cbfilter_input(INPUT_GET, cb,FILTER_SANITIZE_STRING);$wd filter_input(INPUT_GET, wd,FILTER_SANITI…

CB Insights发布AI创业公司100榜单 ,7家中国公司上榜,两家二次登榜

来源&#xff1a;36氪概要&#xff1a;近日&#xff0c;硅谷知名数据公司 CB Insights 在美国旧金山发布了第二届全球最强 AI 创业公司榜单AI 100。旷视科技、出门问问、今日头条、英语流利说、优必选、商汤科技以及寒武纪上榜 。近日&#xff0c;硅谷知名数据公司 CB Insights…

Java技术回顾之JNDI--JNDI API

JNDI的用途&#xff1a;1&#xff09;你可以用jndi来得到object类的属性 Attribute attr directory.getAttributes(personName).get("email"); String email (String)attr.get();2&#xff09;你可以用jndi来搜索对象foxes directory.search("oWiz,cUS",…

遗传算法pareto matlab,matlab遗传算法三目标优化,出来的pareto前沿图只是二维图...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼三目标不是三维图么&#xff1f;怎么修改啊&#xff1f;啊function fmultidisk(x)global I1 I2 Fr350;u0.5;fai1;W3400;v44.4444;m4; tc6.5; Dh75;WaW*m;g9.8;Dmax300;Tmax260;Ti35; Pmax3;P0max7;J4180;c0.113;rou7.8*10^(-6);EWa…

深度学习发展简要笔记

来源&#xff1a;非正式组织概要&#xff1a;在Yann LeCun、Yoshua Bengio和Geoffrey Hinton三巨头nature深度学习综述《deep learning》文章中提到&#xff0c;这段期间神经网络模型被主流的计算机视觉和学术界所抛弃。一、前言深度学习的发展大致分为这么几个学期&#xff1a…