Towards a JSON API for the JDK

Remi Forax forax at univ-mlv.fr
Mon May 19 08:13:13 UTC 2025


----- Original Message -----
> From: "cay horstmann" <cay.horstmann at gmail.com>
> To: "core-libs-dev" <core-libs-dev at openjdk.org>
> Sent: Sunday, May 18, 2025 7:55:12 AM
> Subject: Re: Towards a JSON API for the JDK

Hello Cay,

> +1 for having a JSON battery included with the JDK. And for "Our primary goal is
> that the library be simple to use for parsing, traversing, and generating
> conformant JSON documents."
> 
> Generating JSON could be easier. Why not convenience methods Json.newObject and
> Json.newArray like in https://github.com/arkanovicz/essential-json?
> 
> Parsing with instanceof will work, but is obviously painful today, as your
> example shows. The simplification with deconstruction patterns is not
> impressive either.
> 
> JsonValue doc = Json.parse(inputString);
> if (doc instanceof JsonObject(var members)
>      && members.get("name") instanceof JsonString(String name)
>      && members.get("age") instanceof JsonNumber(int age)) {
>              // use "name" and "age"
> } else throw new NoSuchArgumentException();
> 
> vs. Jackson
> 
> String name = doc.get("name").asText();
> int age = doc.get("age").asInt();
> ...
> 
> If only there was some deconstruction magic that approximates the JavaScript
> code
> 
> const doc = { name: "John", age: 30 }
> const { name, age } = doc

We already have that, it's called a record :)

Basically, you are advocating for a mapping JsonObject <--> record.

[...]

> 
> Cheers,
> 
> Cay
> 

Here is a simple JsonObject mapper using java.util.json types.
  https://github.com/forax/json-object-mapper

I believe this is also the fastest possible ... it leverages method handles to generate the mapping code (it's only 128 lines of code, obviously, it's a prototype)
  https://github.com/forax/json-object-mapper/blob/master/src/main/java/json/RecordMapperImpl.java

It's mostly on par with hand-coded code (i've just a supplementary lookup through a StableValue)

  // Benchmark                        Mode  Cnt   Score   Error  Units
  // RecordMapperBench.mappingSimple  avgt    5  15,057 ± 0,050  ns/op
  // RecordMapperBench.recordMapper   avgt    5  16,997 ± 0,044  ns/op
  

regards,
Rémi


More information about the core-libs-dev mailing list