Introduktion til JSON Binding API (JSR 367) i Java

1. Oversigt

I lang tid var der ingen standard for JSON-behandling i Java. De mest almindelige biblioteker, der bruges til JSON-behandling, er Jackson og Gson.

For nylig kom Java EE7 med en API til parsing og generering af JSON (JSR 353: Java API til JSON Processing).

Og endelig, med frigivelsen af ​​JEE 8, er der en standardiseret API (JSR 367: Java API for JSON Binding (JSON-B)).

For nu er dens vigtigste implementeringer Eclipse Yasson (RI) og Apache Johnzon.

2. JSON-B API

2.1. Maven afhængighed

Lad os starte med at tilføje den nødvendige afhængighed.

Husk, at det i mange tilfælde vil være nok til at medtage afhængigheden af ​​den valgte implementering og javax.json.bind-api vil blive inkluderet transitivt:

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

Den seneste version kan findes på Maven Central.

3. Brug af Eclipse Yasson

Formørkelse Yasson er den officielle referenceimplementering af JSON Binding API (JSR-367).

3.1. Maven afhængighed

For at bruge det skal vi medtage følgende afhængigheder i vores Maven-projekt:

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

De seneste versioner kan findes på Maven Central.

4. Brug af Apache Johnzon

En anden implementering, vi kan bruge, er Apache Johnzon, som overholder JSON-P (JSR-353) og JSON-B (JSR-367) API'er.

4.1. Maven afhængighed

For at bruge det skal vi medtage følgende afhængigheder i vores Maven-projekt:

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

De nyeste versioner findes på Maven Central.

5. API-funktioner

API'en indeholder kommentarer til tilpasning af serialisering / deserialisering.

Lad os oprette en simpel klasse og se, hvordan eksempelkonfigurationen ser ud:

offentlig klasse person {privat int id; @JsonbProperty ("person-name") privat strengnavn; @JsonbProperty (nillable = true) privat streng-mail; @JsonbTransient privat int alder; @JsonbDateFormat ("dd-MM-åååå") privat LocalDate registreret dato; privat BigDecimal løn; @JsonbNumberFormat (locale = "da_US", værdi = "# 0,0") offentlig BigDecimal getSalary () {returløn; } // standard getters og setters}

Efter serialisering vil et objekt af denne klasse se ud:

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

Kommentarerne, der bruges her, er:

  • @JsonbProperty - som bruges til at specificere et brugerdefineret feltnavn
  • @JsonbTransient - når vi vil ignorere feltet under deserialisering / serialisering
  • @JsonbDateFormat - når vi ønsker at definere visningsformatet for datoen
  • @JsonbNumberFormat - til angivelse af visningsformat for numeriske værdier
  • @JsonbNillable - for at muliggøre serialisering af nulværdier

5.1. Serialisering og deserialisering

Først og fremmest er vi nødt til at bruge JSON-repræsentationen af ​​vores objekt JsonbBuilder klasse og dens toJson () metode.

For at starte, lad os oprette en simpel Person objekt som dette:

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

Og øjeblikkelig Jsonb klasse:

Jsonb jsonb = JsonbBuilder.create ();

Derefter bruger vi tilJson metode:

String jsonPerson = jsonb.toJson (person);

For at opnå følgende JSON-repræsentation:

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

Hvis vi vil foretage konverteringen den anden vej, kan vi bruge fraJson metode:

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

Naturligvis kan vi også behandle samlinger:

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

For at opnå følgende JSON-repræsentation:

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

At konvertere fra JSON-array til Liste vi bruger fraJson API:

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

5.2. Brugerdefineret kortlægning med JsonbConfig

Det JsonbConfig klasse giver os mulighed for at tilpasse kortlægningsprocessen for alle klasser.

For eksempel kan vi ændre standardnavngivningsstrategier eller egenskabsrækkefølgen.

Nu bruger vi LOWER_CASE_WITH_UNDERSCORES strategi:

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

For at opnå følgende JSON-repræsentation:

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

Nu ændrer vi ejendomsordren med BAGLÆNS strategi. Ved hjælp af denne strategi er egenskabernes rækkefølge i omvendt rækkefølge til leksikografisk rækkefølge.

Dette kan også konfigureres ved kompileringstidspunktet med kommentaren @JsonbPropertyOrder. Lad os se det i aktion:

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

For at opnå følgende JSON-repræsentation:

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

5.3. Brugerdefineret kortlægning med adaptere

Når kommentarerne og JsonbConfig klasse er ikke nok for os, kan vi bruge adaptere.

For at bruge dem skal vi implementere JsonbAdapter interface, der definerer følgende metoder:

  • adaptToJson - Med denne metode kan vi bruge tilpasset konverteringslogik til serialiseringsprocessen.
  • adaptFromJson - Denne metode giver os mulighed for at bruge brugerdefineret konverteringslogik til deserialiseringsprocessen.

Lad os oprette en Personadapter at behandle id og navn egenskaber for Person klasse:

offentlig klasse PersonAdapter implementerer JsonbAdapter {@ Override offentlig JsonObject adaptToJson (Person p) kaster Undtagelse {returner Json.createObjectBuilder () .add ("id", p.getId ()) .add ("navn", p.getName ()) .build (); } @ Override offentlig person adaptFromJson (JsonObject tilpasset) kaster undtagelse {Person person = ny person (); person.setId (tilpasset.getInt ("id")); person.setName (tilpasset.getString ("navn")); tilbagevendende person }}

Desuden tildeler vi adapteren til vores JsonbConfig eksempel:

JsonbConfig config = ny JsonbConfig (). MedAdapters (ny PersonAdapter ()); Jsonb jsonb = JsonbBuilder.create (config);

Og vi får følgende JSON-repræsentation:

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

6. Konklusion

I denne vejledning så vi et eksempel på, hvordan JSON-B API kunne integreres med Java-applikationer ved hjælp af de tilgængelige implementeringer sammen med eksempler på tilpasning af serialisering og deserialisering ved både kompilering og runtime.

Den komplette kode er som altid tilgængelig på Github.


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