- Jackson介绍
- Jackson入门程序
- Jackson ObjectMapper实现JSON实际的读/写
- Jackson对象序列化/反系列化
- Jackson数据绑定
- Jackson JSON映射到任何Java对象
- Jackson使用具体的Java对象和类型强制转换到JSON使用
- Jackson树模型JsonNode
- Jackson流式API JsonGenerator、JsonParser
开源项目
知识点
相关文章
更多最近更新
更多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转换为ArrayNode而不转换?(Jackson how to transform JsonNode to ArrayNode without casting?)[2023-08-03]
是的,杰克逊的手动解析器设计与其他库非常不同。 特别地,您会注意到, JsonNode具有通常与其他API的数组节点相关联的大部分功能。 因此,您不需要ArrayNode到使用的ArrayNode 。 这里有一个例子: JSON: { "objects" : ["One", "Two", "Three"] } 码: final String json = "{\"objects\" : [\"One\", \"Two\", \"Three\"]}"; final JsonNode arrNode ... -
将Java对象转换为Jackson中的JsonNode [duplicate](Convert Java Object to JsonNode in Jackson [duplicate])[2023-12-03]
截至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 ... -
Spring&MongoCursor&Jackson JsonNode(数据库转换)(Spring & MongoCursor & Jackson JsonNode (Database conversion))[2022-10-10]
我想你在这里错过了一些东西。 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 ...