Skip to content

Latest commit

 

History

History
129 lines (89 loc) · 2.44 KB

README.md

File metadata and controls

129 lines (89 loc) · 2.44 KB

Json Struct

Json mapper without reflection

actions status

json-struct

json-struct provides a standard binding layer between Java classes and JSON documents.

Features

  • No reflection is used
  • Annotation processor resolves bindings at build time
  • Small and fast
  • No Dependency Libraries
  • Constructor binding (for immutable)
  • Java 17+

Usage

Add dependencies.

dependencies {
  implementation("com.mammb:json-struct:0.3.0")
  annotationProcessor("com.mammb:json-struct:0.3.0")
}

Annotate the model with @JsonStruct.

@JsonStruct
public record Person(FullName fullName, int age) {
}

Serialization / Deserialization would be as follows

String string = """
{
    "fullName": {
         "givenName": "Bob",
         "familyName": "Dylan"
    },
    "age": 81,
    "gender": "MALE"
}""";


Person person = Json.objectify(string, Person.class);

person.fullName().givenName();  // Bob
person.fullName().familyName(); // Dylan
person.age();                   // 81
person.gender();                // Gender.MALE

    
String serialized = Json.stringify(person);
// {"fullName":{"givenName":"Bob","familyName":"Dylan"},"age":81,"gender":"MALE"}

The following is equivalent.

Json json = Json.of(Person.class);
Person person = json.fromJson(string);
String serialized = json.toJson(person);

Benchmark

Gson vs Jackson vs json-struct.

$ ./gradlew benchmark:jmh
Instantiation and Serialize, Deserialize
Benchmark            Mode  Cnt      Score      Error  Units
MicroBench.gson      avgt    3  13227.451 ±  463.189  ns/op
MicroBench.jackson   avgt    3  46689.023 ± 1464.963  ns/op
MicroBench.struct    avgt    3   2591.424 ±   11.675  ns/op
Serialize and Deserialize
Benchmark            Mode  Cnt      Score      Error  Units
MicroBench2.gson     avgt    3   4139.815 ±  101.674  ns/op
MicroBench2.jackson  avgt    3   2578.517 ±   55.212  ns/op
MicroBench2.struct   avgt    3   2483.299 ±   30.564  ns/op