Uvod u JSON Binding API (JSR 367) u Javi

1. Pregled

Dugo nije postojao standard za JSON obradu na Javi. Najčešće knjižnice korištene za obradu JSON-a su Jackson i Gson.

Nedavno je Java EE7 došao s API-jem za raščlanjivanje i generiranje JSON-a (JSR 353: Java API za JSON obradu).

I na kraju, izdanjem JEE 8, postoji standardizirani API (JSR 367: Java API za JSON Binding (JSON-B)).

Za sada su njegove glavne implementacije Eclipse Yasson (RI) i Apache Johnzon.

2. JSON-B API

2.1. Ovisnost Mavena

Počnimo s dodavanjem potrebne ovisnosti.

Imajte na umu da će u mnogim slučajevima biti dovoljno uključiti ovisnost za odabranu implementaciju i javax.json.bind-api bit će tranzitivno uključeni:

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

Najnoviju verziju možete pronaći na Maven Central.

3. Korištenje Eclipse Yassona

Eclipse Yasson službena je referentna provedba JSON API-ja za vezanje (JSR-367).

3.1. Ovisnost Mavena

Da bismo ga koristili, u naš Maven projekt moramo uključiti sljedeće ovisnosti:

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

Najnovije verzije možete pronaći na Maven Central.

4. Korištenje Apachea Johnzona

Još jedna implementacija koju možemo koristiti je Apache Johnzon koja je u skladu s API-jem JSON-P (JSR-353) i JSON-B (JSR-367).

4.1. Ovisnost Mavena

Da bismo ga koristili, u naš Maven projekt moramo uključiti sljedeće ovisnosti:

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

Najnovije verzije možete pronaći na Maven Central.

5. API značajke

API pruža napomene za prilagođavanje serializacije / deserializacije.

Stvorimo jednostavnu klasu i pogledajmo kako izgleda primjer konfiguracije:

javna klasa Osoba {private int id; @JsonbProperty ("person-name") ime privatnog niza; @JsonbProperty (nillable = true) privatni niz e-pošte; @JsonbTransient private int age; @JsonbDateFormat ("dd-MM-yyyy") privatni LocalDate registrirani datum; privatna BigDecimalna plaća; @JsonbNumberFormat (locale = "en_US", value = "# 0.0") public BigDecimal getSalary () {povrat plaće; } // standardni getteri i postavljači}

Nakon serializacije objekt ove klase izgledat će poput:

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

Ovdje korištene bilješke su:

  • @JsonbProperty - koji se koristi za specificiranje naziva prilagođenog polja
  • @JsonbTransient - kada želimo zanemariti polje tijekom deserializacije / serializacije
  • @JsonbDateFormat - kada želimo definirati format prikaza datuma
  • @JsonbNumberFormat - za određivanje formata prikaza za numeričke vrijednosti
  • @JsonbNillable - za omogućavanje serializacije null vrijednosti

5.1. Serijalizacija i deserijalizacija

Prije svega, da bismo dobili JSON predstavu našeg objekta, moramo koristiti JsonbBuilder razreda i svoje toJson () metoda.

Za početak, stvorimo jednostavan Osoba objekt poput ovog:

Osoba osoba = nova osoba (1, "Jhon", "[e-pošta zaštićena]", 20, LocalDate.of (2019, 9, 7), BigDecimal.valueOf (1000));

I, instancirajte Jsonb razred:

Jsonb jsonb = JsonbBuilder.create ();

Zatim koristimo toJson metoda:

Niz jsonPerson = jsonb.toJson (osoba);

Da biste dobili sljedeći JSON prikaz:

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

Ako konverziju želimo obaviti na drugi način, možemo koristiti odJson metoda:

Osoba osoba = jsonb.fromJson (jsonPerson, Person.class);

Naravno, možemo i obrađivati ​​zbirke:

Popis personList = Arrays.asList (...); Niz jsonArrayPerson = jsonb.toJson (personList);

Da biste dobili sljedeći JSON prikaz:

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

Za pretvaranje iz JSON polja u Popis koristit ćemo odJson API:

Popis personList = jsonb.fromJson (personJsonArray, novi ArrayList () {}. GetClass (). GetGenericSuperclass ());

5.2. Prilagođeno mapiranje sa JsonbConfig

The JsonbConfig klasa omogućuje nam prilagodbu postupka mapiranja za sve razrede.

Na primjer, možemo promijeniti zadane strategije imenovanja ili redoslijed svojstava.

Sada ćemo koristiti LOWER_CASE_WITH_UNDERSCORES strategija:

JsonbConfig config = novi JsonbConfig (). WithPropertyNamingStrategy (PropertyNamingStrategy.LOWER_CASE_WITH_UNDERSCORES); Jsonb jsonb = JsonbBuilder.create (config); Niz jsonPerson = jsonb.toJson (osoba);

Da biste dobili sljedeći JSON prikaz:

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

Sada ćemo promijeniti vlasnički poredak s REVERSE strategija. Koristeći ovu strategiju, redoslijed svojstava obrnut je od leksikografskog.

To se također može konfigurirati u vrijeme kompajliranja s napomenom @JsonbPropertyOrder. Pogledajmo na djelu:

JsonbConfig config = novi JsonbConfig (). WithPropertyOrderStrategy (PropertyOrderStrategy.REVERSE); Jsonb jsonb = JsonbBuilder.create (config); Niz jsonPerson = jsonb.toJson (osoba); 

Da biste dobili sljedeći JSON prikaz:

{"pay": "1000.0", "registeredDate": "09.07.2019", "person-name": "Jhon", "id": 1, "email": "[email protected]"}

5.3. Prilagođeno mapiranje s adapterima

Kad se bilješke i JsonbConfig klasa nam nisu dovoljni, možemo koristiti adaptere.

Da bismo ih koristili, morat ćemo implementirati JsonbAdapter sučelje, koje definira sljedeće metode:

  • adaptToJson - Ovom metodom možemo koristiti prilagođenu logiku pretvorbe za postupak serializacije.
  • adaptFromJson - Ova metoda omogućuje nam upotrebu prilagođene logike pretvorbe za postupak deserializacije.

Stvorimo a PersonAdapter za obradu iskaznica i Ime atributi Osoba razred:

javna klasa PersonAdapter implementira JsonbAdapter {@Override javni JsonObject adaptToJson (Person p) baca izuzetak {return Json.createObjectBuilder () .add ("id", p.getId ()) .add ("name", p.getName ()) .izgraditi(); } @Override public Person adaptFromJson (JsonObject prilagođen) baca iznimku {Person person = new Person (); person.setId (adaptirano.getInt ("id")); person.setName (adaptirano.getString ("ime")); osoba za povratak; }}

Nadalje, dodijelit ćemo adapter našem JsonbConfig primjer:

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

I dobit ćemo sljedeće JSON predstavljanje:

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

6. Zaključak

U ovom uputstvu vidjeli smo primjer kako integrirati JSON-B API s Java aplikacijama koristeći dostupne implementacije, zajedno s primjerima prilagođavanja serializacije i deserializacije kako tijekom kompajliranja tako i tijekom izvođenja.

Kompletni kôd dostupan je, kao i uvijek, na Githubu.


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