Introduksjon til JSON Binding API (JSR 367) i Java

1. Oversikt

I lang tid var det ingen standard for JSON-behandling i Java. De vanligste bibliotekene som brukes til JSON-behandling er Jackson og Gson.

Nylig kom Java EE7 med en API for parsing og generering av JSON (JSR 353: Java API for JSON Processing).

Og til slutt, med utgivelsen av JEE 8, er det en standardisert API (JSR 367: Java API for JSON Binding (JSON-B)).

For nå er hovedimplementeringene Eclipse Yasson (RI) og Apache Johnzon.

2. JSON-B API

2.1. Maven avhengighet

La oss starte med å legge til den nødvendige avhengigheten.

Husk at i mange tilfeller vil det være nok å inkludere avhengigheten av den valgte implementeringen og javax.json.bind-api vil bli inkludert transitt:

 javax.json.bind javax.json.bind-api 1.0 

Den nyeste versjonen finner du på Maven Central.

3. Bruke Eclipse Yasson

Formørkelse Yasson er den offisielle referanseimplementeringen av JSON Binding API (JSR-367).

3.1. Maven avhengighet

For å bruke den, må vi inkludere følgende avhengigheter i vårt Maven-prosjekt:

 org.eclipse yasson 1.0.1 org.glassfish javax.json 1.1.2 

De nyeste versjonene finner du på Maven Central.

4. Bruke Apache Johnzon

En annen implementering vi kan bruke er Apache Johnzon som overholder JSON-P (JSR-353) og JSON-B (JSR-367) APIer.

4.1. Maven avhengighet

For å bruke den, må vi inkludere følgende avhengigheter i vårt Maven-prosjekt:

 org.apache.geronimo.specs geronimo-json_1.1_spec 1.0 org.apache.johnzon johnzon-jsonb 1.1.4 

De nyeste versjonene finner du på Maven Central.

5. API-funksjoner

API-et gir merknader for å tilpasse serialisering / deserialisering.

La oss lage en enkel klasse og se hvordan eksempelkonfigurasjonen ser ut:

offentlig klasse Person {privat int id; @JsonbProperty ("person-name") privat strengnavn; @JsonbProperty (nillable = true) privat streng-e-post; @JsonbTransient privat alder; @JsonbDateFormat ("dd-MM-åååå") privat LocalDate registrert dato; privat BigDecimal lønn; @JsonbNumberFormat (locale = "en_US", value = "# 0.0") offentlig BigDecimal getSalary () {returlønn; } // standard getters and setters}

Etter serieisering vil et objekt av denne klassen se ut som:

{"email": "[email protected]", "id": 1, "person-name": "Jhon", "registeredDate": "07-09-2019", "lønn": "1000.0"}

Kommentarene som brukes her er:

  • @JsonbProperty - som brukes til å spesifisere et tilpasset feltnavn
  • @JsonbTransient - når vi vil ignorere feltet under deserialisering / serialisering
  • @JsonbDateFormat - når vi vil definere visningsformatet for datoen
  • @JsonbNumberFormat - for å spesifisere visningsformatet for numeriske verdier
  • @JsonbNillable - for å muliggjøre serialisering av nullverdier

5.1. Serialisering og deserialisering

Først og fremst, for å oppnå JSON-representasjonen av objektet vårt, må vi bruke JsonbBuilder klasse og dens toJson () metode.

For å starte, la oss lage en enkel Person objekt som dette:

Personperson = ny person (1, "Jhon", "[email protected]", 20, LocalDate.of (2019, 9, 7), BigDecimal.valueOf (1000));

Og øyeblikkelig Jsonb klasse:

Jsonb jsonb = JsonbBuilder.create ();

Deretter bruker vi toJson metode:

String jsonPerson = jsonb.toJson (person);

For å oppnå følgende JSON-representasjon:

{"email": "[email protected]", "id": 1, "person-name": "Jhon", "registeredDate": "07-09-2019", "lønn": "1000.0"}

Hvis vi vil gjøre konverteringen den andre veien, kan vi bruke fraJson metode:

Personperson = jsonb.fromJson (jsonPerson, Person.class);

Naturligvis kan vi også behandle samlinger:

Liste personList = Arrays.asList (...); String jsonArrayPerson = jsonb.toJson (personList);

For å oppnå følgende JSON-representasjon:

[{"email": "[email protected]", "id": 1, "person-name": "Jhon", "registeredDate": "09-09-2019", "lønn": "1000.0"}, {"email": "[email protected]", "id": 2, "person-name": "Jhon", "registeredDate": "09-09-2019", "lønn": "1500.0"},. ..]

Å konvertere fra JSON-array til Liste vi bruker fraJson API:

Liste personList = jsonb.fromJson (personJsonArray, ny ArrayList () {}. GetClass (). GetGenericSuperclass ());

5.2. Tilpasset kartlegging med JsonbConfig

De JsonbConfig klasse lar oss tilpasse kartleggingsprosessen for alle klasser.

For eksempel kan vi endre standard navnestrategier eller rekkefølgen for egenskaper.

Nå skal vi bruke LOWER_CASE_WITH_UNDERSCORES strategi:

JsonbConfig config = ny JsonbConfig (). WithPropertyNamingStrategy (PropertyNamingStrategy.LOWER_CASE_WITH_UNDERSCORES); Jsonb jsonb = JsonbBuilder.create (config); String jsonPerson = jsonb.toJson (person);

For å oppnå følgende JSON-representasjon:

{"email": "[email protected]", "id": 1, "person-name": "Jhon", "registered_date": "07-09-2019", "lønn": "1000.0"}

Nå endrer vi eiendomsordren med OMVENDT strategi. Ved hjelp av denne strategien er rekkefølgen av egenskaper i omvendt rekkefølge til leksikografisk rekkefølge.

Dette kan også konfigureres ved kompileringstidspunktet med merknaden @JsonbPropertyOrder. La oss se det i aksjon:

JsonbConfig config = ny JsonbConfig (). WithPropertyOrderStrategy (PropertyOrderStrategy.REVERSE); Jsonb jsonb = JsonbBuilder.create (config); String jsonPerson = jsonb.toJson (person); 

For å oppnå følgende JSON-representasjon:

{"lønn": "1000.0", "registeredDate": "07-09-2019", "person-name": "Jhon", "id": 1, "email": "[email protected]"}

5.3. Tilpasset kartlegging med adaptere

Når kommentarene og JsonbConfig klasse er ikke nok for oss, kan vi bruke adaptere.

For å bruke dem, må vi implementere JsonbAdapter grensesnitt, som definerer følgende metoder:

  • adaptToJson - Med denne metoden kan vi bruke tilpasset konverteringslogikk for serialiseringsprosessen.
  • adaptFromJson - Denne metoden lar oss bruke tilpasset konverteringslogikk for deserialiseringsprosessen.

La oss lage en Personadapter å behandle id og Navn attributter til Person klasse:

offentlig klasse PersonAdapter implementerer JsonbAdapter {@Override offentlig JsonObject adaptToJson (Person p) kaster Unntak {return Json.createObjectBuilder () .add ("id", p.getId ()) .add ("name", p.getName ()) .bygge(); } @ Override public Person adaptFromJson (JsonObject tilpasset) kaster Unntak {Person person = new Person (); person.setId (tilpasset.getInt ("id")); person.setName (tilpasset.getString ("navn")); retur person; }}

Videre tildeler vi adapteren til vår JsonbConfig forekomst:

JsonbConfig config = new JsonbConfig (). WithAdapters (new PersonAdapter ()); Jsonb jsonb = JsonbBuilder.create (config);

Og vi får følgende JSON-representasjon:

{"id": 1, "name": "Jhon"}

6. Konklusjon

I denne opplæringen så vi et eksempel på hvordan du integrerer JSON-B API med Java-applikasjoner ved hjelp av tilgjengelige implementeringer, sammen med eksempler på å tilpasse serialisering og deserialisering på både kompilering og kjøretid.

Den komplette koden er som alltid tilgjengelig på Github.


$config[zx-auto] not found$config[zx-overlay] not found