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.

Spring Full-Stack Practical Cases
Spring Full-Stack Practical Cases
Spring Full-Stack Practical Cases
Master Jackson JsonNode in Spring Boot 3: Create, Convert & Manipulate JSON

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):

ObjectMapper writeValue overloads
ObjectMapper writeValue overloads

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
}
Add node result
Add node result

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());
Edit node result
Edit node result

Delete node

JsonNode userNode = rootNode.get("user");
ObjectNode objectNode = (ObjectNode) userNode;
objectNode.remove("firstName");
System.err.println(rootNode.toPrettyString());
Delete node result
Delete node result
backendJSONSpring BootjacksonJsonNode
Spring Full-Stack Practical Cases
Written by

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.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.