使用 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条评论 本章将会是自定义模型的最后一部分.原本打算结束这部分内容,不过实在不忍心放弃这个示例.来自于 ...
随机推荐
- Fedora下使用minicom及USB串口线
一.minicom Fedora不像以前的RedHat,不能直接输入minicom回车,因为在目录/dev/下面没有modem这个子目录,而minicom的运行默认是有这个目录的,所以直接敲是不行的. ...
- 深入学习 Git 工作流
原文 https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md 个人在学习git工作流的过程中,从原有的 SVN ...
- linux达人养成计划学习笔记(六)—— 挂载命令
一.查询与自动挂载 mount #查询系统中已挂载的设备 mount -a #根据配置文件/etc/fstab的内容,自动挂载 二.挂载命令格式 mount [-t 文件系统] [-o 特殊选项] 设 ...
- POJ 1815 Friendship (Dinic 最小割)
Friendship Time Limit: 2000MS Memory Limit: 20000K Total Submissions: 8025 Accepted: 2224 Descri ...
- Git 别名(分布式版本控制系统)
1.Git 别名 Git 并不会在你输入部分命令时自动推断出你想要的命令.如果不想每次都输入完整的 Git 命令,可以通过 git config 文件来轻松地为每一个命令设置一个别名.这里有一些例子你 ...
- 《JAVA与模式》之备忘录模式
一.备忘录(Memento)模式结构 备忘录对象是一个用来存储另外一个对象内部状态的快照(snapshot)的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化,存储起来, ...
- SQL 正则表达式 `(user_log_acct)?+.+`
SELECT 语句可以使用正则表达式做列选择,下面的语句查询除了 ds 和 hr 之外的所有列: SELECT `(ds|hr)?+.+` FROM test
- [转]Intellij IDEA快捷键与使用小技巧
Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Shift+Click,可以关闭文件Ctrl+[ ...
- 解决Myeclipse中导入自定义的配色方案后,JSP中的js代码块为白色背景的问题
捣鼓了大半个上午,终于搞定.这样设置就可以了: 点击MyEclipse上方的菜单栏中的window菜单.选择Preferences菜单项.在弹出的窗口的左侧树形菜单依次选择:MyEclipse.Fil ...
- JAVA中Set集合--HashSet的使用
一.使用HashSet添加一个String类型的值: public static void hashSet1(){ HashSet<String> hashSet = new HashSe ...