来源: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;}

Jackson第二篇【从JSON字符串中取值】相关推荐

  1. json字符串中key值下划线命名转换为驼峰命名

    json字符串中key值下划线命名转换为驼峰命名: 例如: public class JsonUtils {public final static void convert(Object json) ...

  2. Jackson第一篇【JSON字符串、实体之间的相互转换】

    来源:http://blog.csdn.net/songyongfeng/article/details/6932655 既然你看到这篇文章相信你已经了解JSON的好处了,那么废话不多说直接进入主题. ...

  3. php json 循环输出html,我要用js从json文件中取值,并输出的html页面,有个问题

    json文件有多个 0.json 1.json 2.json 3.json ... 现在的情况是js可以挨个读取json文件中的内容,但是每次读取新文件的时候之前的文件内容就没了,我想要加载新json ...

  4. android如何从json字符串中取自己想要的数据

    场景 假设后台返回的json数据是以字符串的形式 需要自己处理才能拿到自己想要的数据 如 {"code":2000,"msg":"success&qu ...

  5. python 下划线转驼峰_json字符串中key值下划线命名转换为驼峰命名

    json字符串中key值下划线命名转换为驼峰命名: 例如: 原json串: String json= "{'user_name':'ok','user_sex':0,'object_info ...

  6. python如何从列表中提取数据_Python 从列表中取值和取索引的方法

    如下所示: name_list["zhangsan","lisi","wangwu"] #1.取值 print(name_list[0]) ...

  7. Newtonsoft.Json取json字符串中的值得用法 这里是取的时候

    Newtonsoft.Json取json字符串中的值得用法 看红色的部分就可以了 http://www.cnblogs.com/fierceeagle/p/3545615.html <%@ We ...

  8. php 去掉转义引号的反斜杠,PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠...

    PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠 通过AJAX传到PHP的json字符串有时候加上反斜杠"\"来转义,PHP处理时需要先去掉反斜杠,然后再json_dec ...

  9. 问题关于json 字符串中带有反斜杠的问题

    系列文章目录 文章目录 系列文章目录 问题关于json 字符串中带有反斜杠的问题 一. 原因 二.使用步骤 1.代码示例 问题关于json 字符串中带有反斜杠的问题 一. 原因 前端在使用了两次str ...

最新文章

  1. nodejs 获取文件路径_Qunar 酒店 Nodejs 覆盖率收集实践
  2. TaskTracker获取并执行map或reduce任务的过程(一)
  3. C#设计模式之十二代理模式(Proxy Pattern)【结构型】
  4. python实现一个简单的加法计算器_Python简易项目 加减计算器的实现
  5. 基于D3.js实现分类多标签的Tree型结构可视化
  6. android开发相关资料整理【2011-10-04】
  7. python如何提高工作效率_用Python的这3个优点,让工作效率提升一倍
  8. ipv4和计算机地址是什么意思,什么是ipv4 ipv6 ipv9 区别是什么(一) -电脑资料
  9. Java使用ODBC连接Access数据库
  10. Pycharm破解(学习python的day01)
  11. 科普 | 实景三维模型和地形三维模型 时空克隆 三维视频融合 投影融合 点卯-魔镜系列
  12. 周报—FPGA(浩子)
  13. element ui图标使用方法
  14. vue 全局、局部引入
  15. python中numpy函数ftt_语音MFCC提取:librosa python_speech_feature(2019.12)
  16. FileWriter和FileReader的基本使用
  17. Kubernetes:基于命名行终端/ Web 控制台的管理工具 kubebox
  18. 用 iPhone 一键重启、关闭电脑
  19. HTML 关于hr标签,虚线
  20. MySQL日期函数计算年龄

热门文章

  1. 论文浅尝 | 基于图卷积网络的跨语言图谱实体对齐
  2. 领域应用 | HiTA知识图谱 “药品-适应证”图谱数据发布!
  3. 郑杰 | 如何拿回我们自己的医疗数据?
  4. 科普 | “开放知识”的定义
  5. AC日记——Mato的文件管理 bzoj 3289
  6. 文字滚动的另一方法 拆分文字来做到文字滚动
  7. 现实生活中我们常常遭遇“怀疑”
  8. 【Q】【poj 1144】【poj 1523】
  9. FTP协议、电子邮件系统、Telnet远程控制
  10. 计算机网络(十五)-数据链路层-CSMA/CA协议