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的更多相关文章

  1. 7. Jackson用树模型处理JSON是必备技能,不信你看

    每棵大树,都曾只是一粒种子.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BA ...

  2. 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 ...

  3. 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 ...

  4. class-决策树Decision Tree

    顾名思义,决策树model是树形结构,在分类中,表示基于特征对实例进行分类的过程.可以认为是"if-else"的合集,也可以认为是特征空间,类空间上条件概率分布.主要优点是分类速度 ...

  5. thinkphp模型层Model、Logic、Service讲解

    thinkphp模型层Model.Logic.Service讲解 时间:2014-08-24 15:54:56   编辑:一切随缘   文章来源:php教程网 已阅读:771 次       js特效 ...

  6. 『线段树 Segment Tree』

    更新了基础部分 更新了\(lazytag\)标记的讲解 线段树 Segment Tree 今天来讲一下经典的线段树. 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间 ...

  7. sklearn中树模型可视化的方法

    在机器学习的过程中,我们常常会用到树模型的方式来解决我们的问题.在工业界,我们不仅要针对某个问题利用机器学习的方法来解决问题,而且还需要能力解释其中的原理或原因.今天主要在这里记录一下树模型是怎么做可 ...

  8. 表达式树(Expression Tree)

    饮水思源 本文并非原创而是下面网址的一个学习笔记 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/e ...

  9. Qt 学习之路 2(51):布尔表达式树模型

    Qt 学习之路 2(51):布尔表达式树模型 豆子 2013年5月15日 Qt 学习之路 2 17条评论 本章将会是自定义模型的最后一部分.原本打算结束这部分内容,不过实在不忍心放弃这个示例.来自于 ...

随机推荐

  1. webDriver.Close() 和 webDriver.Quit() 、webDriver.Dispose() 的区别

    1. webDriver.Close() - Close the browser window that the driver has focus of //关闭当前焦点所在的窗口2. webDriv ...

  2. (org.jbehave.core.failures.BeforeOrAfterFailed: webdriver selenium错误解决。

    (org.jbehave.core.failures.BeforeOrAfterFailed: Method initWebDriver (annotated with @BeforeStory in ...

  3. iOS 10 的一个重要更新-开发 iMessage 的第三方插件

    苹果官方的 Messages 在 iOS 10 推出了非常重大的更新,可能主要是想从其他 IM 巨头手里抢点市场份额回来,包括 Facebook Messenger, Wechat 和 Snapcha ...

  4. cd及目录快速切换

    一.cd   ~ 切换到用户目录 二.cd   - cd - 返回进入当前目录前所在目录 三.pushd.popd.dirs 在Linux的多目录命令提示符中工作是一种痛苦的事情,但以下这些利用lin ...

  5. GIF Brewery for Mac(录制 Gif 动图工具)安装

    1.软件简介    GIF Brewery 一款用于录制 Gif 动图等的工具. 2.资源列表 链接 提取密码 系统要求 软件语言 GIF Brewery for Mac v3.9.5 ltmf ma ...

  6. MongoDB 学习笔记(1)

    数据库 一个mongodb中可以建立多个数据库. MongoDB的默认数据库为"db",该数据库存储在data目录中. MongoDB的单个实例可以容纳多个独立的数据库,每一个都有 ...

  7. 活久见: 原来 Chrome 浏览器支持 Import from 语法

    需要满足以下三个条件: 1.高版本的Chrome ,总而言之越新越好……,其他浏览器请参考:https://caniuse.com/#search=import 2.必须在服务器环境下才能运行,譬如a ...

  8. echarts 认知笔记

    0.echarts.setOption的核心认知 请注意,它是合并对象,而不是替换对象. 举个简单的例子,如果你第一次setOption时在series中配置了10个对象. 那么你下一次你意图使用只有 ...

  9. jmeter响应信息unicode 编码转成中文

    在jmeter 发送请求过程中,有时候后台返回的是unicode 代码,如: {"status":-1,"msg":"\u63d0\u4ea4\u65 ...

  10. Logstash 报错 An unexpected error occurred! :error => bad URI(is not URI?,是因为路径c:\program files\logstash\logstash.bat 中有空格

    I am trying to run logstash under c:\program filesbut I get an error An unexpected error occurred! : ...