How to convert an object to JSON and back
Short answer
The Java standard library has no JSON parser. People usually use the Jackson library (Spring uses it too) or Google's Gson. You add them in pom.xml or build.gradle. With Jackson an object becomes JSON in one line:
// src/main/java/shop/JsonDemo.java
package shop;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonDemo {
record User(String name, int age) {}
public static void main(String[] args) throws Exception {
var mapper = new ObjectMapper();
String json = mapper.writeValueAsString(new User("Anna", 30));
System.out.println(json); // {"name":"Anna","age":30}
}
}Jackson understands records without extra configuration since version 2.12.
From JSON to an object
readValue() creates an object of the class you need:
// src/main/java/shop/JsonDemo.java
User user = mapper.readValue("{\"name\":\"Oleg\",\"age\":25}", User.class);
System.out.println(user.name()); // OlegA list of objects
Because of type erasure, a list is described with a TypeReference:
// src/main/java/shop/JsonDemo.java
List<User> users = mapper.readValue(json, new TypeReference<List<User>>() {});Gson
Gson has a similar API:
// src/main/java/shop/GsonDemo.java
var gson = new Gson();
String json = gson.toJson(new User("Anna", 30));
User user = gson.fromJson(json, User.class);Common mistake
Building JSON by concatenating strings. Quotes and line breaks inside values break the result:
void main() {
String name = "Anna \"The Great\"";
IO.println("{\"name\":\"" + name + "\"}");
}Output:
{"name":"Anna "The Great""}No parser can read such JSON. A library escapes special characters for you.
Functions used in this recipe
- record — Declares a record — an immutable data class with ready-made equals(), hashCode() and toString().
- String.formatted() — Uses the string itself as a template and fills it in — a shorter form of String.format().