Master Jackson JsonNode in Spring Boot 3: Create, Convert & Manipulate JSON
This article demonstrates how to use Jackson's JsonNode tree model within Spring Boot 3, covering node creation, conversion from JSON strings and Java objects, tree manipulation—including adding, editing, and deleting nodes—and serialization back to JSON, with complete code examples for each operation.
Environment: SpringBoot 3.4.2
1. Introduction
Jackson is a powerful Java library for handling JSON data. JsonNode is a core class in Jackson that enables tree‑model processing of JSON.
This article focuses on using the tree model with JsonNode, demonstrating creation, conversion, and manipulation of nodes.
2. Practical Cases
2.1 Create Node
First, create an ObjectMapper instance, which is used for all subsequent operations. ObjectMapper mapper = new ObjectMapper(); In a Spring Boot environment, you can inject the mapper directly:
@Service
public class JsonService {
private final ObjectMapper mapper;
public JsonService(ObjectMapper mapper) {
this.mapper = mapper;
}
// TODO
}Two ways to create a node:
JsonNode node = mapper.createObjectNode(); JsonNode node = JsonNodeFactory.instance.objectNode();2.2 Convert Node
From JSON string
String jsonStr = """
{"title":"Spring Boot3 Practical Cases","author":"Pack_xg"}
""";
JsonNode node = mapper.readTree(jsonStr);Using JsonParser
JsonFactory factory = mapper.getFactory();
JsonParser parser = factory.createParser(jsonStr);
JsonNode node = mapper.readTree(parser);From Java object
User user = new User(1L, "Pack_xg");
JsonNode node = mapper.valueToTree(user);
// or
JsonNode node = mapper.convertValue(user, JsonNode.class);Example of converting a Java object to JsonNode and extracting fields:
User user = new User(1L, "Pack_xg");
JsonNode node = mapper.convertValue(user, JsonNode.class);
Long id = node.get("id").asLong();
String name = node.get("name").asText();
System.err.printf("id = %d, name = %s%n", id, name);Output: id = 1, name = Pack_xg Convert to JSON string
ObjectMapper mapper = new ObjectMapper();
User user = new User(1L, "Pack_xg");
mapper.writeValue(System.out, user);Output: {"id":1,"name":"Pack_xg"} ObjectMapper provides several overloaded writeValue methods (illustrated below):
Convert to Java object
Using treeToValue:
JsonNode node = ...;
Book value = mapper.treeToValue(node, Book.class);Or via token stream:
JsonParser parser = mapper.treeAsTokens(node);
Book value = mapper.readValue(parser, Book.class);Complete example:
JsonNode node = mapper.createObjectNode();
ObjectNode objectNode = (ObjectNode) node;
objectNode.put("title", "Spring Full Stack Cases");
objectNode.put("author", "pack");
Book book = mapper.treeToValue(node, Book.class);
System.err.println(book);Output:
Book [title=Spring Full Stack Cases, author=pack]2.3 Operate Tree Nodes
Assume a data.json file with the following content:
{
"user": {
"firstName": "pack",
"lastName": "xg"
},
"title": "Spring Boot3 Practical Cases",
"company": "XXXOOO Tech Co"
}Read the root node:
ObjectMapper mapper = new ObjectMapper();
ClassPathResource resource = new ClassPathResource("data.json");
InputStream is = resource.getInputStream();
JsonNode rootNode = mapper.readTree(is);Locate nodes
JsonNode firstName = rootNode.path("user").path("firstName");
System.err.println(firstName.asText()); // pack
// alternative
firstName = rootNode.get("user").get("firstName");
firstName = rootNode.withObject("user").get("firstName");
String lastName = rootNode.at("/user/lastName").asText();Add new node
ObjectNode newNode = ((ObjectNode) rootNode).put("price", new BigDecimal("70"));
System.err.println(newNode.toPrettyString());Result:
{
"user": {
"firstName": "pack",
"lastName": "xg"
},
"title": "Spring Boot3 Practical Cases",
"company": "XXXOOO Tech Co",
"price": 70
}Edit node
ObjectNode objectNode = (ObjectNode) rootNode;
TextNode textNode = mapper.createObjectNode().textNode("Digital Innovation Tech Co");
JsonNode ret = objectNode.set("company", textNode);
System.err.println(ret.toPrettyString());Delete node
JsonNode userNode = rootNode.get("user");
ObjectNode objectNode = (ObjectNode) userNode;
objectNode.remove("firstName");
System.err.println(rootNode.toPrettyString());Spring Full-Stack Practical Cases
Full-stack Java development with Vue 2/3 front-end suite; hands-on examples and source code analysis for Spring, Spring Boot 2/3, and Spring Cloud.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
