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.