DEV Community

CitronBrick
CitronBrick

Posted on • Edited on

JSON-B : An Introduction

The Java API for JSON Binding (JSON-B) is a JavaEE/JakartaEE specification (JSR-353) to convert Java objects to json & vice-versa. Apache Johnzon is an implementation of the JSON-B spec.

Javadoc

JSON-B is an alternative to GSON & Jackson.

Consider the following Java class (simplified)

class Task {
    String description;
    LocalDate deadline;
    boolean over;
}
Enter fullscreen mode Exit fullscreen mode

You can convert Task instances to json as follows:

Task task = new Task("Jump")
Jsonb jsonb = JsonbBuilder.create();
String taskJson = jsonb.toJson(task);
Enter fullscreen mode Exit fullscreen mode

{"deadline":"2021-10-15","description":"Jump","over":false}

Let's say I want to initialize a bunch of Task objects from fakerestapi.azurewebsites.net. It provides a json web-service for activities with the following schema :

Activity schema: id title dueDate completed

To convert this json objects of this schema to Activity instances, you can use the @JsonbProperty annotation.

class Task {
    @JsonbProperty("title")
    String description;

    @JsonbProperty("dueDate")
    LocalDate deadline;

    @JsonbDateFormat(JsonbDateFormat.DEFAULT_FORMAT)
    @JsonbProperty("completed")
    boolean over;

    @JsonbNillable
    // creator can be optionally present in json
    String creator; 
}
Enter fullscreen mode Exit fullscreen mode

Properties that can be optionally present/absent in the json, must be annotated with @JsonbNillable

Suppose you have multiple sources of Activities each with their own schema you can create & use JsonbAdapters.

@JsonbTypeAdapter
class GermanTaskAdapter implements JsonbAdapter<Task, JsonObject> {

    public Task adaptFromJson(JsonObject jo) {
       var description = jo.getString("Titel");
       var deadline = LocalDate.parse(jo.getString("Stichtag"));
       var over = jo.getBoolean("vollendet");
       return new Task(description, deadline, over);
    }

    public JsonObject adaptToJson(Task task) {
       return Json.createObjectBuilder()
           .add("id", 0)
           .add("Titel", task.getTitle())
           .add("Stichtag", task.getDeadline().toString())
           .add("vollendet", task.isOver())
    }
}
Enter fullscreen mode Exit fullscreen mode

You can have multiple adapters for a domain class, through which you can consume from multiple sources & provide multiple json implementations.

In the above adapter, I have used the *Java API for JSON Processing
*
JSON-P API to create and use JsonObject instances.

If you are using Spring there is JsonbHttpMessageConverter since version 5.

This is my first online technical article (was unpublished for a looong time). Questions & Feedback welcome.
Thanks for reading.

Speedy emails, satisfied customers

Postmark Image

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Discover a treasure trove of wisdom within this insightful piece, highly respected in the nurturing DEV Community enviroment. Developers, whether novice or expert, are encouraged to participate and add to our shared knowledge basin.

A simple "thank you" can illuminate someone's day. Express your appreciation in the comments section!

On DEV, sharing ideas smoothens our journey and strengthens our community ties. Learn something useful? Offering a quick thanks to the author is deeply appreciated.

Okay