private void processNode(JsonNode jsonNode, StringBuilder yaml, int depth) {
if (jsonNode.isValueNode()) {
yaml.append(jsonNode.asText());
else if (jsonNode.isArray()) {
for (JsonNode arrayItem : jsonNode) {
appendNodeToYaml(arrayItem, yaml, depth, true);
else if (jsonNode.isObject()) {
appendNodeToYaml(jsonNode, yaml, depth, false);
首先,考虑一个Value节点。 只需调用节点的asText方法即可获取该值的String表示形式。
接下来,看一下Array节点。 Array节点中的每个项目本身都是JsonNode,因此需要遍历Array并将每个节点传递给appendNodeToYaml方法。 还需要知道这些节点是数组的一部分。
但是,节点本身不包含任何告诉的内容,因此需要将一个标志传递给appendNodeToYaml方法。
最后,要遍历每个Object节点的所有子节点。 一种选择是使用JsonNode.elements。 但是,无法从元素中确定字段名称,因为它仅包含字段值,代码如下:
@Test
public void test16() throws IOException {
String json = "{\"name\":{\"first\":\"Tatu\",\"last\":\"Saloranta\"},\"title\":\"Jackson founder\",\"company\":\"FasterXML\",\"pets\":[{\"type\":\"dog\",\"number\":1},{\"type\":\"fish\",\"number\":50}]}";
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(json);
Iterator<JsonNode> elements = rootNode.elements();
while(elements.hasNext()){
JsonNode next = elements.next();
System.out.println(next);
输出结果如下:
Object {"first": "Tatu", "last": "Saloranta"}
Value "Jackson Founder" Value "FasterXML"
Array [{"type": "dog", "number": 1},{"type": "fish", "number": 50}]
不包含 Obejct Value Array
相反,可以使用JsonNode.fields,因为可以访问字段名称和值:
@Test
public void test17() throws IOException {
String json = "{\"name\":{\"first\":\"Tatu\",\"last\":\"Saloranta\"},\"title\":\"Jackson founder\",\"company\":\"FasterXML\",\"pets\":[{\"type\":\"dog\",\"number\":1},{\"type\":\"fish\",\"number\":50}]}";
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(json);
Iterator<Map.Entry<String, JsonNode>> fields = rootNode.fields();
while(fields.hasNext()){
Map.Entry<String, JsonNode> next = fields.next();
System.out.println(next);
输出结果如下:
name={"first":"Tatu","last":"Saloranta"}
title="Jackson founder"
company="FasterXML"
pets=[{"type":"dog","number":1},{"type":"fish","number":50}]
对于每个字段,将字段名称添加到输出中。 然后将值传递给processNode方法,将其作为子节点处理:
private void appendNodeToYaml(JsonNode node, StringBuilder yaml, int depth, boolean isArrayItem) {
Iterator<Map.Entry<String, JsonNode>> fields = node.fields();
boolean isFirst = true;
while (fields.hasNext()) {
Map.Entry<String, JsonNode> jsonField = fields.next();
addFieldNameToYaml(yaml, jsonField.getKey(), depth, isArrayItem && isFirst);
processNode(jsonField.getValue(), yaml, depth+1);
isFirst = false;
无法从该节点知道它深度是多少。 因此,将一个称为depth的字段传递到processNode方法中,以对此进行跟踪。 每次获得子节点时,我们都会增加此值,以便可以正确缩进YAML输出中的字段:
private void addFieldNameToYaml(
StringBuilder yaml, String fieldName, int depth, boolean isFirstInArray) {
if (yaml.length()>0) {
yaml.append("\n");
int requiredDepth = (isFirstInArray) ? depth-1 : depth;
for(int i = 0; i < requiredDepth; i++) {
yaml.append(" ");
if (isFirstInArray) {
yaml.append("- ");
yaml.append(fieldName);
yaml.append(": ");
现在,已经准备好所有代码以遍历节点并创建YAML输出,可以运行测试以表明其有效。
完成代码如下:
public class JsonNodeIterator {
private static final String NEW_LINE = "\n";
private static final String FIELD_DELIMITER = ": ";
private static final String ARRAY_PREFIX = "- ";
private static final String YAML_PREFIX = " ";
public String toYaml(JsonNode root) {
StringBuilder yaml = new StringBuilder();
processNode(root, yaml, 0);
return yaml.toString();
private void processNode(JsonNode jsonNode, StringBuilder yaml, int depth) {
if (jsonNode.isValueNode()) {
yaml.append(jsonNode.asText());
else if (jsonNode.isArray()) {
for (JsonNode arrayItem : jsonNode) {
appendNodeToYaml(arrayItem, yaml, depth, true);
else if (jsonNode.isObject()) {
appendNodeToYaml(jsonNode, yaml, depth, false);
private void appendNodeToYaml(JsonNode node, StringBuilder yaml, int depth, boolean isArrayItem) {
Iterator<Map.Entry<String, JsonNode>> fields = node.fields();
boolean isFirst = true;
while (fields.hasNext()) {
Map.Entry<String, JsonNode> jsonField = fields.next();
addFieldNameToYaml(yaml, jsonField.getKey(), depth, isArrayItem && isFirst);
processNode(jsonField.getValue(), yaml, depth+1);
isFirst = false;
private void addFieldNameToYaml(StringBuilder yaml, String fieldName, int depth, boolean isFirstInArray) {
if (yaml.length()>0) {
yaml.append(NEW_LINE);
int requiredDepth = (isFirstInArray) ? depth-1 : depth;
for(int i = 0; i < requiredDepth; i++) {
yaml.append(YAML_PREFIX);
if (isFirstInArray) {
yaml.append(ARRAY_PREFIX);
yaml.append(fieldName);
yaml.append(FIELD_DELIMITER);
1.概述使用JsonNode进行各种转换以及添加,修改和删除节点。2.创建一个节点创建节点的第一步是使用默认构造函数实例化ObjectMapper对象:ObjectMapper mapper = new ObjectMapper();由于创建ObjectMapper对象非常昂贵,因此建议将同一对象重复用于多个操作。接下来,一旦有了ObjectMapper,就有三种不同的方式来创建树节点。2.1 从头开始构建节点创建节点的最常见方法如下:JsonNode node = mapper.cre
<!-- jackson begin -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.1.4&
Json已经成为当前服务器与 WEB 应用之间数据传输的公认标准。目前java
json解析工具有阿里的fast
json,google的GSON,以及SpringMVC 默认的解析工具
Jackson。SpringBoot默认自带是
jackson,晚上有很多
json转换速率的比对,如
jackson,阿里的fast
json等,不过
jackson足够
使用了.
使用jackson
1.pom.xml文件
中引用依赖包.
这段工作中总会遇到使用Java处理JSON的情况,大部分都使用的是开源工具Jackson实现的。因此总结一下发上来,希望对看到的人有所帮助。
上一篇文档中,我已经讲过Java如何使用Jackson来对Json进行序列化,这边我再稍微回顾一下。
Jackson中有个ObjectMapper类很是实用,用于Java对象与JSON的互换。
1、Java对象转换为JSON:
User user=n
<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head>
<title>Put data to db<
第一篇咱们主要学习了实体与
json的相互转换的问题,但是咱们需要的是数据 你转换18遍我取不到数据也是扯淡,那么今天咱们就一起学习一下如何从
使用Jackson从
Json字符串
中取值。废话不说直接上代码(注意第一篇里面的方法我都移到
JsonProcessUtil里面了方便
使用 )。
从
Json字符串
中取出指定
节点的值
介绍Jackson JsonNode和ObjectNode
Jackson JsonNode类,完整路径为com.fasterxml.jackson.databind.JsonNode,是Jackson的json树模型(对象图模型)。Jackson能读JSON至JsonNode实例,写JsonNode到JSON。本文不涉及json序列化或反序列化,主要介绍如何从头构建JsonNode对象图,之后你可以序列化为json。
1. JsonNode vs. ObjectNode
The Jackson JsonN
今天在使用Jackson的时候 ,将一个json字符串转换成json对象的时候 JsonNode jsonNode = Json.parse(jsonStr);获取的是一个JsonNode对象, 然后发现这个对象并不能进行put和add操作 现提供一下解决方案 : JsonNode jsonNode = Json.parse(jsonStr);
ObjectNode obje...
树模型是
JSON数据内存
树的表示形式,这是最灵活的方法,它就类似于XML的DOM解析器。
Jackson提供了
树模型API来生成和解析
JSON串,主要用到如下三个核心类:
JsonNodeFactory:顾名思义,用来构造各种
JsonNode节点的工厂。例如对象
节点Object
Node、数组
节点Array
Node等等
JsonNode:表示
json节点。可以往里面塞值,从而最终构造出一颗
json树
ObjectMapper:实现
JsonNode和
JSON字符串的互转
这里有个萌新的概念:
JsonNo
最近在开发一个后台管理系统的权限管理模块,涉及到各种树状结构的数据处理逻辑,例如:增,删,改,查等;相比普通的数组结构数据,树状结构的处理就没有数组那么的直观,但是也没那么复杂,需要多一步——递归查找来对数据进行深度遍历操作,那么这里呢,博主也将开发过程中总结出来的方法分享给大家,一文带你吃透JS树装结构数据处理:
1、新增节点
2、删除节点
3、修改节点
4、查找节点.........
JsonNode node = ...
if (node == null || !node.has("fieldName")) {
// 节点为空或不包含指定名称的子节点
以上方法可以结合使用,以便更加准确地判断 Jackson JsonNode 是否为空。