Jackson树模型JsonNode

2019-05-09 23:36|来源: 网路

树模型准备JSON文件的内存树表示。 ObjectMapper构建JsonNode节点树。这是最灵活的方法。它类似于DOM解析器的XML。

从JSON创建树

ObjectMapper提供一个指针树的根节点在读取JSON之后。根节点可用于遍历完全树。考虑下面的代码片段获得提供JSON字符串的根节点。

//Create an ObjectMapper instance
ObjectMapper mapper = new ObjectMapper();	
String jsonString = "{\"name\":\"Mahesh Kumar\", \"age\":21,\"verified\":false,\"marks\": [100,90,85]}";
//create tree from JSON
JsonNode rootNode = mapper.readTree(jsonString);

遍历树模型

使用相对路径来根节点在遍历树,并处理该数据得到的每个节点。考虑下面的代码片段遍历提供的根节点的树。

JsonNode nameNode = rootNode.path("name");
System.out.println("Name: "+ nameNode.getTextValue());
 
JsonNode marksNode = rootNode.path("marks");
Iterator iterator = marksNode.getElements();

示例

创建一个名为JacksonTester在Java类文件目录 C:\>Jackson_WORKSPACE.

File: JacksonTester.java

import java.io.IOException;
import java.util.Iterator;

import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

public class JacksonTester {
   public static void main(String args[]){
      JacksonTester tester = new JacksonTester();
      try {
         ObjectMapper mapper = new ObjectMapper();
         String jsonString = "{\"name\":\"Mahesh Kumar\", \"age\":21,\"verified\":false,\"marks\": [100,90,85]}";
         JsonNode rootNode = mapper.readTree(jsonString);

         JsonNode nameNode = rootNode.path("name");
         System.out.println("Name: "+ nameNode.getTextValue());

         JsonNode ageNode = rootNode.path("age");
         System.out.println("Age: " + ageNode.getIntValue());

         JsonNode verifiedNode = rootNode.path("verified");
         System.out.println("Verified: " + (verifiedNode.getBooleanValue() ? "Yes":"No"));

         JsonNode marksNode = rootNode.path("marks");
         Iterator<JsonNode> iterator = marksNode.getElements();
         System.out.print("Marks: [ ");
         while (iterator.hasNext()) {
            JsonNode marks = iterator.next();
            System.out.print(marks.getIntValue() + " "); 
         }
         System.out.println("]");
      } catch (JsonParseException e) {
         e.printStackTrace();
      } catch (JsonMappingException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

验证输出结果

使用javac编译如下类:

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行jacksonTester看到结果:

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Name: Mahesh Kumar
Age: 21
Verified: No
Marks: [ 100 90 85 ]

树到JSON转换

在这个例子中,我们已经使用JsonNode并将其写入到一个JSON文件,并读回创建了一棵树。

创建一个名为JacksonTester在Java类文件目录 C:\>Jackson_WORKSPACE.

File: JacksonTester.java

import java.io.File;
import java.io.IOException;
import java.util.Iterator;

import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.ArrayNode;
import org.codehaus.jackson.node.ObjectNode;

public class JacksonTester {
   public static void main(String args[]){
      JacksonTester tester = new JacksonTester();
      try {
         ObjectMapper mapper = new ObjectMapper();

         JsonNode rootNode = mapper.createObjectNode();
         JsonNode marksNode = mapper.createArrayNode();
         ((ArrayNode)marksNode).add(100);
         ((ArrayNode)marksNode).add(90);
         ((ArrayNode)marksNode).add(85);
         ((ObjectNode) rootNode).put("name", "Mahesh Kumar");
         ((ObjectNode) rootNode).put("age", 21);
         ((ObjectNode) rootNode).put("verified", false);
         ((ObjectNode) rootNode).put("marks",marksNode);

         mapper.writeValue(new File("student.json"), rootNode);

         rootNode = mapper.readTree(new File("student.json"));

         JsonNode nameNode = rootNode.path("name");
         System.out.println("Name: "+ nameNode.getTextValue());

         JsonNode ageNode = rootNode.path("age");
         System.out.println("Age: " + ageNode.getIntValue());

         JsonNode verifiedNode = rootNode.path("verified");
         System.out.println("Verified: " + (verifiedNode.getBooleanValue() ? "Yes":"No"));

         JsonNode marksNode1 = rootNode.path("marks");
         Iterator<JsonNode> iterator = marksNode1.getElements();
         System.out.print("Marks: [ ");
         while (iterator.hasNext()) {
            JsonNode marks = iterator.next();
            System.out.print(marks.getIntValue() + " "); 
         }
         System.out.println("]");
      } catch (JsonParseException e) {
         e.printStackTrace();
      } catch (JsonMappingException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

验证结果

使用javac编译如下类:

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行jacksonTester看到的结果:

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Name: Mahesh Kumar
Age: 21
Verified: No
Marks: [ 100 90 85 ]

从树到Java对象转换

在这个例子中,我们已经使用JsonNode并将其写入到一个JSON文件,并回读然后将一个Student对象其转换为创建了一棵树。

创建一个名为JacksonTester在Java类文件目录 C:\>Jackson_WORKSPACE.

File: JacksonTester.java

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.node.ArrayNode;
import org.codehaus.jackson.node.ObjectNode;
public class JacksonTester {
   public static void main(String args[]){
      JacksonTester tester = new JacksonTester();
      try {
         ObjectMapper mapper = new ObjectMapper();

         JsonNode rootNode = mapper.createObjectNode();
         JsonNode marksNode = mapper.createArrayNode();
         ((ArrayNode)marksNode).add(100);
         ((ArrayNode)marksNode).add(90);
         ((ArrayNode)marksNode).add(85);
         ((ObjectNode) rootNode).put("name", "Mahesh Kumar");
         ((ObjectNode) rootNode).put("age", 21);
         ((ObjectNode) rootNode).put("verified", false);
         ((ObjectNode) rootNode).put("marks",marksNode);

         mapper.writeValue(new File("student.json"), rootNode);

         rootNode = mapper.readTree(new File("student.json"));

         Student student = mapper.treeToValue(rootNode, Student.class);

         System.out.println("Name: "+ student.getName());
         System.out.println("Age: " + student.getAge());
         System.out.println("Verified: " + (student.isVerified() ? "Yes":"No"));
         System.out.println("Marks: "+Arrays.toString(student.getMarks()));
      } catch (JsonParseException e) {
         e.printStackTrace();
      } catch (JsonMappingException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }}class Student {
   String name;
   int age;
   boolean verified;
   int[] marks;
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public boolean isVerified() {
      return verified;
   }
   public void setVerified(boolean verified) {
      this.verified = verified;
   }
   public int[] getMarks() {
      return marks;
   }
   public void setMarks(int[] marks) {
      this.marks = marks;
   }}

验证结果

使用javac编译如下类:

C:\Jackson_WORKSPACE>javac JacksonTester.java

现在运行jacksonTester看到结果:

C:\Jackson_WORKSPACE>java JacksonTester

验证输出

Name: Mahesh Kumar
Age: 21
Verified: No
Marks: [ 100 90 85 ]


相关问答

更多
  • 是的,杰克逊的手动解析器设计与其他库非常不同。 特别地,您会注意到, JsonNode具有通常与其他API的数组节点相关联的大部分功能。 因此,您不需要ArrayNode到使用的ArrayNode 。 这里有一个例子: JSON: { "objects" : ["One", "Two", "Three"] } 码: final String json = "{\"objects\" : [\"One\", \"Two\", \"Three\"]}"; final JsonNode arrNode ...
  • 截至Jackson 1.6,您可以使用: JsonNode node = objectMapper.valueToTree(map); 要么 JsonNode node = mapper.convertValue(object, JsonNode.class); 资料来源: 有没有办法把pojo直接序列化为treemodel? As of Jackson 1.6, you can use: JsonNode node = mapper.valueToTree(map); or JsonNode nod ...
  • 我已经粘贴了有答案的代码。 我在看错了节点。 我在之前的评论中提到过,我并没有真正看到关闭问题的选项。 为了说清楚,答案是,只要我写入子节点,父节点也将具有该属性。 这是工作代码,它不需要修复,因为我说我正在查看错误的节点。 I have already pasted the code that had the answer. I was looking at the wrong node. I mentioned in my previous comment, I didn't really see an ...
  • 由Tatu Saloranta回答: 第二种方式应该更高效,因为它只创建和使用逻辑令牌流,但不必编码JSON,然后将其解码(解析)到令牌流或从令牌流解析。 关于杰克逊,这几乎是最佳的。 关于使其更加优化的唯一方法是直接使用TokenBuffer (杰克逊本身用于缓冲的东西)。 就像是: TokenBuffer tb = new TokenBuffer(); // or one of factory methods mapper.writeValue(tb, myPojo); MyPojo copy = ma ...
  • JSON最好通过将其写为字节来序列化。 在Jackson中,它是使用ObjectMapper完成的,例如: byte[] raw = objectMapper.writeValueAsBytes(root); MemCache并不真正需要Serializable,因为它是所有原始字节; 虽然Java客户端可能会尝试提供帮助并处理序列化。 JSON is best serialized by writing it out as bytes. In Jackson, it is done using Obje ...
  • 首先,JSON节点filesNode不是JSON对象。 正如你可以在你的例子中找到的,这个节点的结构为"file": [ ... ] ,这是一个JSON数组。 因此,如果文件节点是数组,则需要更改if语句,然后继续: // wrong if (filesNode.isObject()) { ... } // correct if (filesNode.isArray()) { ... } 其次,您需要确定JSON对象file的JSON节点repository ,以检查回购的名称是否正确: ...
  • 您可以使用List findParents(String fieldName)获取具有该属性的所有节点,这样就可以实现此目的。 来自文档: 在此节点或其后代中查找包含指定字段的JSON对象的方法。 如果在此节点或其后代中找不到匹配的字段,则返回null。 我做了一个快速示例但是必须在您发布的JSON blob中添加一些字符,因为它缺少一些逗号和括号,并且无法被ObjectMapper读取。 这很简单: JsonNode root = mapper.readTree(SCHEMA); Li ...
  • 我想你在这里错过了一些东西。 MongoCursor返回给你一个Document对象,而不是一个String 。 你是否调用Document.toString()并使用String结果? 应该不需要你做任何字符串解析。 你应该能够从Mongo中获取Document对象,并调用其中的getter函数来获取所需的字段,这些字段也将保留它们的数据类型(字符串,数字,布尔值和日期),例如检查所有BsonDocument类Javadocs上的函数: https : BsonDocument I think you'r ...
  • 这应该按原样运行,所以我怀疑可能存在版本不兼容。 由于Jersey使用Jackson 1.x(1.8或1.9),你需要使用相同的版本; 2.0类在不同的Java包中,允许1.x和2.x共存(以避免强制升级)。 因此,请确保您使用的是与Jersey相同的版本。 This should work as-is, so I am suspecting that maybe there is a version incompatibility. Since Jersey uses Jackson 1.x (1.8 o ...
  • 您将无法重命名键值JSON对中的键。 您需要做的是创建一个具有相同值但具有不同键的新键值对,并删除旧键值。 JsonNode node = ...; ObjectNode object = (ObjectNode) node; object.set("MyNewFieldName", new TextNode(node.get("temperature").asText())); object.remove("temperature"); You won't be able to rename keys ...