In an earlier article, I wrote about reading and writing JSON in Java by using multiple JSON processing libraries like JSON.simple, Jackson, Moshi, and Gson.

In this article, you'll learn how to read and write JSON using Jackson. Jackson is a popular open-source library for processing JSON in Java. It provides different APIs like ObjectMapper, ObjectParser, and JsonGenerator. We can read JSON from multiple resources like a file, a string variable, or any network. ObjectMapper can be used to convert a Java Object to its JSON representation.

Dependencies

To add Jackson to your Gradle project, add the following dependency to build.gradle file:

implementation 'com.fasterxml.jackson.core:jackson-databind:2.10.0'

For Maven, include the below dependency to your pom.xml file:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.0</version>
</dependency>

Create Java Class

Let us create a simple Java class named Book that we will use to convert Java Objects to JSON and back:

Book.java

public class Book {

    private String title;
    private String isbn;
    private long year;
    private String[] authors;

    public Book() {
    }

    public Book(String title, String isbn, long year, String[] authors) {
        this.title = title;
        this.isbn = isbn;
        this.year = year;
        this.authors = authors;
    }

    // getters and setters, equals(), toString() .... (omitted for brevity)
}

Convert Java Object to JSON String

To convert a Java Object to a JSON string, you can use the writeValueAsString() method of ObjectMapper, as shown below:

try {
    // create book object
    Book book = new Book("Thinking in Java", "978-0131872486", 1998,
            new String[]{"Bruce Eckel"});

    // convert book object to JSON
    String json = new ObjectMapper().writeValueAsString(book);

    // print JSON string
    System.out.println(json);

} catch (Exception ex) {
    ex.printStackTrace();
}

You should see the following output printed on the console:

{"title":"Thinking in Java","isbn":"978-0131872486","year":1998,"authors":["Bruce Eckel"]}

Convert Java Object to JSON File

The ObjectMapper class provides the writeValue() method for converting a Java Object to a JSON file:

try {
    // create book object
    Book book = new Book("Thinking in Java", "978-0131872486", 1998,
            new String[]{"Bruce Eckel"});

    // create object mapper instance
    ObjectMapper mapper = new ObjectMapper();

    // convert book object to JSON file
    mapper.writeValue(Paths.get("book.json").toFile(), book);

} catch (Exception ex) {
    ex.printStackTrace();
}

Convert List of Java Objects to JSON Array

Just like a single Java Object conversion to JSON, you can also convert a list of Java Objects to their JSON representation using the same writeValue() method:

try {
    // create books list
    List<Book> books = Arrays.asList(
            new Book("Thinking in Java", "978-0131872486", 1998,
                    new String[]{"Bruce Eckel"}),
            new Book("Head First Java", "0596009208", 2003,
                    new String[]{"Kathy Sierra", "Bert Bates"})
    );

    // create object mapper instance
    ObjectMapper mapper = new ObjectMapper();

    // convert books object to JSON file
    mapper.writeValue(Paths.get("books.json").toFile(), books);

} catch (Exception ex) {
    ex.printStackTrace();
}

Java Object to Pretty Print JSON File

Jackson API can also write pretty print JSON by using the DefaultPrettyPrinter class:

try {
    // create book object
    Book book = new Book("Thinking in Java", "978-0131872486", 1998,
            new String[]{"Bruce Eckel"});

    // create object mapper instance
    ObjectMapper mapper = new ObjectMapper();

    // create an instance of DefaultPrettyPrinter
    ObjectWriter writer = mapper.writer(new DefaultPrettyPrinter());

    // convert book object to JSON file
    writer.writeValue(Paths.get("book.json").toFile(), book);

} catch (Exception ex) {
    ex.printStackTrace();
}

The above code should write the following pretty print JSON to book.json:

{
  "title" : "Thinking in Java",
  "isbn" : "978-0131872486",
  "year" : 1998,
  "authors" : [ "Bruce Eckel" ]
}

Convert Java Map to JSON File

Jackson is not just limited to Java Objects. You can even convert a Java Map into a JSON file using ObjectMapper, as shown below:

try {
    // create book map
    Map<String, Object> map = new HashMap<>();
    map.put("title", "Thinking in Java");
    map.put("isbn", "978-0131872486");
    map.put("year", 1998);
    map.put("authors", new String[]{"Bruce Eckel"});

    // create object mapper instance
    ObjectMapper mapper = new ObjectMapper();

    // convert book map to JSON file
    mapper.writeValue(Paths.get("book.json").toFile(), map);

} catch (Exception ex) {
    ex.printStackTrace();
}

Convert JSON String to Java Object

To convert a JSON string into a Java Object, you can use the readValue() method from ObjectMapper:

try {
    // JSON string
    String json = "{\"title\":\"Thinking in Java\",\"isbn\":\"978-0131872486\"" +
            ",\"year\":1998,\"authors\":[\"Bruce Eckel\"]}";

    // create object mapper instance
    ObjectMapper mapper = new ObjectMapper();

    // convert JSON string to Book object
    Book book = mapper.readValue(json, Book.class);

    // print book
    System.out.println(book);

} catch (Exception ex) {
    ex.printStackTrace();
}

Convert JSON File to Java Object

To read a JSON file into a Java Object, you can use the same readValue() method:

try {
    // create object mapper instance
    ObjectMapper mapper = new ObjectMapper();

    // convert JSON string to Book object
    Book book = mapper.readValue(Paths.get("book.json").toFile(), Book.class);

    // print book
    System.out.println(book);

} catch (Exception ex) {
    ex.printStackTrace();
}

Convert JSON Array to List of Java Objects

The following example demonstrates how to convert a JSON array to a list of Java Objects:

try {
    // create object mapper instance
    ObjectMapper mapper = new ObjectMapper();

    // convert JSON array to list of books
    List<Book> books = Arrays.asList(mapper.readValue(Paths.get("books.json").toFile(), Book[].class));

    // print books
    books.forEach(System.out::println);

} catch (Exception ex) {
    ex.printStackTrace();
}

Convert JSON File to Java Map

Just like JSON file to Java Object conversion, you can also convert a JSON file to a Java Map with same properties and keys, as follows:

try {
    // create object mapper instance
    ObjectMapper mapper = new ObjectMapper();

    // convert JSON file to map
    Map<?, ?> map = mapper.readValue(Paths.get("book.json").toFile(), Map.class);

    // print map entries
    for (Map.Entry<?, ?> entry : map.entrySet()) {
        System.out.println(entry.getKey() + "=" + entry.getValue());
    }

} catch (Exception ex) {
    ex.printStackTrace();
}

@JsonProperty Annotation

By default, Jackson uses the class field names as JSON property names. With @JsonProperty, you can specify a custom JSON property name:

public class Book {

    private String title;
    @JsonProperty("BookISBN")
    private String isbn;
    private long year;
    private String[] authors;
		
    // ...
}

Now if you convert a Book object to JSON, the output should look like below:

{"title":"Thinking in Java","BookISBN":"978-0131872486","year":1998,"authors":["Bruce Eckel"]}

@JsonIgnore and @JsonIgnoreProperties Annotations

By default, Jackson attempts to parse all fields, even static or transient fields. By using @JsonIgnore annotation, you can specify a field that should be ignored while serializing and deserializing JSON:

public class Book {

    private String title;
    private String isbn;
    @JsonIgnore
    private long year;
    private String[] authors;
		
    // ...
}

Similarly, the @JsonIgnoreProperties annotation is used to specify a list of ignored properties on class level:

@JsonIgnoreProperties({"year", "authors"})
public class Book {

    private String title;
    private String isbn;
    private long year;
    private String[] authors;
		
    // ...
}

✌️ Like this article? Follow @attacomsian on Twitter. You can also follow me on LinkedIn and DEV. Buy me a coffee (cost $3)

Need help to start a new Spring Boot or MEAN stack project? I am available for contract work. Hire me to accomplish your business goals with engineering and design. Let’s talk about your project: hi@attacomsian.com.