使用 Jackson 树模型(tree model) API 处理 JSON
http://blog.csdn.net/gao1440156051/article/details/54091702
http://blog.csdn.net/u010003835/article/details/54846916
*********************************************************
Jackson 中提供了树模型(tree model) API 来生成和解析 json 字符串。如果你不想为你的 json 结构单独建类与之对应的话,则可以选择该 API。下面介绍如何在项目中引入以及使用树模型(tree model) API 。
1. 通过 maven 引入 Jackson 依赖
树模型(tree model) API 既需要 jackson-core 模块,又需要 jackson-databind 模块,因此我们直接将 jackson-databind 模块引入即可,由依赖传递性 jackson-core 和 jackson-annotations
都会被引入。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.0</version>
</dependency>
2. 树模型(tree model) API 核心概念介绍
树模型(tree model) API 主要需要用到的类是 JsonNodeFactory、JsonNode、ObjectMapper。
- JsonNodeFactory:用来构造各种 JsonNode 节点,例如对象节点 ObjectNode、数组节点 ArrayNode 等;
- JsonNode:表示 json 节点,可以往里添加各种 json 值,从而构造出 json 树;
- ObjectMapper:将 JsonNode 节点转换成最终的 json 字符串;
3. 使用树模型(tree model) API 来构造 json 字符串
假设我们要生成如下的json字符串
{
"name": "aaa",
"email": "aaa@aa.com",
"age": 24,
"pets": {
"petName": "kitty",
"petAge": 3
},
"skills": [ "java","linux","mysql"]
}
packageorg.lifw.jackosn.tree;
importjava.io.IOException;
importorg.junit.Test;
importcom.fasterxml.jackson.core.JsonFactory;
importcom.fasterxml.jackson.core.JsonGenerator;
importcom.fasterxml.jackson.databind.ObjectMapper;
importcom.fasterxml.jackson.databind.node.ArrayNode;
importcom.fasterxml.jackson.databind.node.JsonNodeFactory;
importcom.fasterxml.jackson.databind.node.ObjectNode;
publicclass TreeModelTest {
//JsonNodeFactory 实例,可全局共享
privateJsonNodeFactory jsonNodeFactory = JsonNodeFactory.instance;
//JsonFactory 实例,线程安全
privateJsonFactory jsonFactory = newJsonFactory();
@Test
publicvoid testTreeModelGenerate() throwsIOException {
//根节点
ObjectNode rootNode = jsonNodeFactory.objectNode();
//往根节点中添加普通键值对
rootNode.put("name","aaa");
rootNode.put("email","aaa@aa.com");
rootNode.put("age",24);
//往根节点中添加一个子对象
ObjectNode petsNode = jsonNodeFactory.objectNode();
petsNode.put("petName","kitty")
.put("petAge",3);
rootNode.set("pets", petsNode);
//往根节点中添加一个数组
ArrayNode arrayNode = jsonNodeFactory.arrayNode();
arrayNode.add("java")
.add("linux")
.add("mysql");
rootNode.set("skills", arrayNode);
//调用ObjectMapper的writeTree方法根据节点生成最终json字符串
JsonGenerator generator = jsonFactory.createGenerator(System.out);
ObjectMapper objectMapper = newObjectMapper();
objectMapper.writeTree(generator, rootNode);
}
}
4. 使用树模型(tree model) API 来解析 json 字符串
这里我们就解析上面生成的 json 字符串,从中取出各种我们需要的值。代码如下
packageorg.lifw.jackosn.tree;
importjava.io.IOException;
importorg.junit.Test;
importcom.fasterxml.jackson.core.JsonFactory;
importcom.fasterxml.jackson.core.JsonGenerator;
importcom.fasterxml.jackson.core.JsonParseException;
importcom.fasterxml.jackson.databind.JsonMappingException;
importcom.fasterxml.jackson.databind.JsonNode;
importcom.fasterxml.jackson.databind.ObjectMapper;
importcom.fasterxml.jackson.databind.node.ArrayNode;
importcom.fasterxml.jackson.databind.node.JsonNodeFactory;
importcom.fasterxml.jackson.databind.node.ObjectNode;
publicclass TreeModelTest {
privateString jsonString =
"{\"name\":\"aaa\",\"email\":\"aaa@aa.com\",\"age\":24,\"pets\":{\"petName\":\"kitty\",\"petAge\":3},\"skills\":[\"java\",\"linux\",\"mysql\"]}";
@Test
publicvoid testTreeModelParse() throwsJsonParseException, JsonMappingException, IOException {
ObjectMapper objectMapper = newObjectMapper();
//使用ObjectMapper的readValue方法将json字符串解析到JsonNode实例中
JsonNode rootNode = objectMapper.readTree(jsonString);
//直接从rootNode中获取某个键的值,
//这种方式在如果我们只需要一个长json串中某个字段值时非常方便
JsonNode nameNode = rootNode.get("name");
String name = nameNode.asText();
System.out.println(name);
//从 rootNode 中获取数组节点
JsonNode skillsNode = rootNode.get("skills");
for(inti = 0;i < skillsNode.size();i++) {
System.out.println(skillsNode.get(i).asText());
}
//从 rootNode 中获取子对象节点
JsonNode petsNode = rootNode.get("pets");
String petsName = petsNode.get("petName").asText();
System.out.println(petsName);
}
}
5. 树模型(tree model) API总结
从上面的例子中可以看出树模型(tree model) API比Jackson 流式(Streaming) API 简单了很多,不管是生成 json 字符串还是解析 json 字符串。但是相对于数据绑定而言还是比较复杂。树模型(tree model) API在只需要取出一个大json串中的几个值时比较方便。如果json中每个值都需要获得,那么这种方式便显得比较繁琐了。
*********************************************************************
Jackson 对Json 串的构建 可以 不通过 java 类得以实现。
可以通过直接构建 树形结构的方式构建。
以下的代码可以作为参考:
import java.io.IOException;
import model.MyValue; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode; public class JacksonSecond { public static void main(String[] args) throws JsonProcessingException, IOException { ObjectMapper mapper = new ObjectMapper(); ObjectNode root = (ObjectNode) mapper.readTree("{\"name\": \"fromFile \", \"age\":23}"); String name = root.get("name").asText();
int age = root.get("age").asInt();
System.out.println("root:now" + "\n" + "name: "+ name + "\n" + "age: " + age + "\n"); root.with("other").put("type","student");
root.put("address", "Dalian");
root.putPOJO("test", new MyValue()); String json = mapper.writeValueAsString(root);
System.out.println("root:now" + "\n" + json + "\n"); JsonNode kk = root.get("test");
System.out.println(kk); } }
输出:
root:now
name: fromFile
age: 23 root:now
{"name":"fromFile ","age":23,"other":{"type":"student"},"address":"Dalian","test":{"name":null,"age":0}} name: null
age: 0
使用 Jackson 树模型(tree model) API 处理 JSON的更多相关文章
- 7. Jackson用树模型处理JSON是必备技能,不信你看
每棵大树,都曾只是一粒种子.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BA ...
- Undo/Redo for Qt Tree Model
Undo/Redo for Qt Tree Model eryar@163.com Abstract. Qt contains a set of item view classes that use ...
- ARM Linux 3.x的设备树(Device Tree)
1. ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pai ...
- class-决策树Decision Tree
顾名思义,决策树model是树形结构,在分类中,表示基于特征对实例进行分类的过程.可以认为是"if-else"的合集,也可以认为是特征空间,类空间上条件概率分布.主要优点是分类速度 ...
- thinkphp模型层Model、Logic、Service讲解
thinkphp模型层Model.Logic.Service讲解 时间:2014-08-24 15:54:56 编辑:一切随缘 文章来源:php教程网 已阅读:771 次 js特效 ...
- 『线段树 Segment Tree』
更新了基础部分 更新了\(lazytag\)标记的讲解 线段树 Segment Tree 今天来讲一下经典的线段树. 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间 ...
- sklearn中树模型可视化的方法
在机器学习的过程中,我们常常会用到树模型的方式来解决我们的问题.在工业界,我们不仅要针对某个问题利用机器学习的方法来解决问题,而且还需要能力解释其中的原理或原因.今天主要在这里记录一下树模型是怎么做可 ...
- 表达式树(Expression Tree)
饮水思源 本文并非原创而是下面网址的一个学习笔记 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/e ...
- Qt 学习之路 2(51):布尔表达式树模型
Qt 学习之路 2(51):布尔表达式树模型 豆子 2013年5月15日 Qt 学习之路 2 17条评论 本章将会是自定义模型的最后一部分.原本打算结束这部分内容,不过实在不忍心放弃这个示例.来自于 ...
随机推荐
- git difftool 详解
一.如何比较两个版本之间的差异 1.显示版本得到版本的commit id 2.执行difftool命令 按Y进行比较,我用的是DiffMerge这个软件对代码进行比较的 二.比较当前所修改的内容 gi ...
- linux shell 脚本攻略学习14--head命令详解,tail命令详解
当要查看上千行的大文件时,我们可不会用cat命令把整个文件内容给打印出来,相反,我们可能只需要看文件的一小部分地内容(例如文件的前十行和后十行),我们也有可能需要打印出来前n行或后n行,也有可能打印除 ...
- iOS 10 之 网络权限带来的坑
症状 iOS 10 之后,陆陆续续地有用户联系我们,说新机第一次安装.第一次启动的时候,app 首屏一片空白,完全没数据.kill 掉重新打开就好了. 一开始以为是用户网络情况不好,但随着越来越多的用 ...
- Apache2.2和Apache2.4中httpd.conf配置文件 权限的异同
Windows环境从Apache2.2改成Apache2.4后httpd.conf中的设置异同. 1.权限设定方式变更 2.2使用Order Deny / Allow的方式,2.4改用Require ...
- C语言学习笔记 (010) - 编写strcpy函数
很多公司的面试官在面试程序员的时候,要求应聘者写出库函数strcpy()的工作方式或者叫实现,很多人以为这个题目很简单,实则不然,别看这么一个小小的函数,它可以从三个方面来考查: (1)编程风格 (2 ...
- MongoDB学习笔记(4)--collection
MongoDB 创建集合 本章节我们为大家介绍如何使用 MongoDB 来创建集合. MongoDB 中使用 createCollection() 方法来创建集合. 语法格式: db.createCo ...
- Android Studio多Module开发需要注意的问题
多module开发,其中的一个为入口module,其他module为独立的“应用”(library) 1.在原有的项目导入另外个项目的module为主项目的次module,即在A项目中添加一个启动B项 ...
- SharePoint 2013 Step by Step——How to Create a Lookup Column to Another Site(Cross Site)
OverView In this post,I want to show u how to add a look up column in my list or library that looks ...
- Android中Is library配置的作用
在Android开发中如果用eclipse开发的话,在配置的时候会有一个选项,Is library一直没有研究明白,经过上网查找,有人归纳了用法,归纳的很好作为保留.解决了我多个项目共享资源的好方法. ...
- shell 数组,双层循环打印变量
双层循环,打印循环执行次数. 特别注意 ,shell 脚本赋值时 '=' 两侧不能有空格,否则报错,shell command not found 但在if 语句中需要有: STR1="ab ...