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.