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. 进阶之路(基础篇) - 019 Serial串口函数说明

    本文总结了Arduino常用串口操作函数,函数说明部分来源于Arduino 官网串口使用指南,示例与实验部分为自编.本文是对Arduino串口操作函数的较全面总结,可作为工具贴查找使用. 函数:if( ...

  2. git学习笔记(三)—— 远程仓库

    一.gitHub&&SSH Key 为git仓库提供托管服务的,所以注册一个github账号,就可以免费获得git远程仓库. 本地Git仓库和GitHub仓库之间的传输是通过SSH加密 ...

  3. 【Android】Android屏幕状态操作

    目录结构: contents structure [+] 如何监听屏幕锁屏 如何实现手机屏幕在锁屏后继续运行 最近笔者在做一个功能,就是实现Android程序在锁屏后可以继续运行,笔者在网上查了一些资 ...

  4. 【Struts2】剖析Struts2中的反射技术 ValueStack(值栈)

    1,Struts2框架主要组件的处理流程 在说ValueStack之前,笔者先说一说Struts2中常用的组件,struts2中常用组件有strutsPrepareAndExecuteExceptio ...

  5. PWA 入门: 写个非常简单的 PWA 页面

    Progressive Web Apps 是 Google 提出的用前沿的 Web 技术为网页提供 App 般使用体验的一系列方案. 这篇文章里我们来完成一个非常简单的 PWA 页面. 一个 PWA ...

  6. Postman 网络调试工具

    1.Postman 简介 Postman 是一款功能强大的网页调试与发送网页 HTTP 请求的工具.我们可以用来很方便的模拟 get 或者 post 或者其他方式的请求来调试接口. 官网下载地址 Po ...

  7. java 高性能读模式(译)

    原文地址:http://tutorials.jenkov.com/java-performance/read-patterns.html 好久没翻译了,逛知乎,无意间发现的一个链接,写的太好了,而且内 ...

  8. yum install mysql56

    官方有写: http://dev.mysql.com/doc/mysql-repo-excerpt/5.6/en/linux-installation-yum-repo.html yum update ...

  9. eclipse导入class文件

    右键src文件夹->build path->config build path->library->add class folder->create new folder ...

  10. golang 学习笔记 ---内存分配与管理

    Go语言——内存管理 参考: 图解 TCMalloc Golang 内存管理 Go 内存管理 问题 内存碎片:避免内存碎片,提高内存利用率. 多线程:稳定性,效率问题. 内存分配   内存划分 are ...