Úvod do rozhrania JSON Binding API (JSR 367) v jazyku Java
1. Prehľad
Dlho neexistoval žiadny štandard pre spracovanie JSON v Jave. Najbežnejšie knižnice používané na spracovanie JSON sú Jackson a Gson.
Nedávno prišla Java EE7 s API na analýzu a generovanie JSON (JSR 353: Java API pre JSON Processing).
A nakoniec, s vydaním JEE 8, existuje štandardizované API (JSR 367: Java API pre väzbu JSON (JSON-B)).
Zatiaľ sú jej hlavnými implementáciami Eclipse Yasson (RI) a Apache Johnzon.
2. API JSON-B
2.1. Maven závislosť
Začnime pridaním potrebnej závislosti.
Majte na pamäti, že v mnohých prípadoch bude stačiť zahrnúť závislosť od zvolenej implementácie a javax.json.bind-api budú prechodne zahrnuté:
javax.json.bind javax.json.bind-api 1.0
Najnovšiu verziu nájdete v Maven Central.
3. Používanie Eclipse Yasson
Eclipse Yasson je oficiálna referenčná implementácia API viazania JSON (JSR-367).
3.1. Maven závislosť
Aby sme to mohli použiť, musíme do nášho projektu Maven zahrnúť nasledujúce závislosti:
org.eclipse yasson 1.0.1 org.glassfish javax.json 1.1.2
Najnovšie verzie nájdete v Maven Central.
4. Používanie Apache Johnzon
Ďalšou implementáciou, ktorú môžeme použiť, je Apache Johnzon, ktorý je v súlade s API JSON-P (JSR-353) a JSON-B (JSR-367).
4.1. Maven závislosť
Aby sme to mohli použiť, musíme do nášho projektu Maven zahrnúť nasledujúce závislosti:
org.apache.geronimo.specs geronimo-json_1.1_spec 1.0 org.apache.johnzon johnzon-jsonb 1.1.4
Najnovšie verzie nájdete na serveri Maven Central.
5. Funkcie API
Rozhranie API poskytuje poznámky na prispôsobenie serializácie / deserializácie.
Poďme vytvoriť jednoduchú triedu a pozrime sa, ako vyzerá príkladná konfigurácia:
public class Osoba {private int id; @JsonbProperty ("osoba-meno") súkromné meno reťazca; @JsonbProperty (nillable = true) súkromný e-mail s reťazcom; @JsonbTransient private int age; @JsonbDateFormat ("dd-MM-rrrr") súkromné LocalDate registeredDate; súkromný BigDecimálny plat; @JsonbNumberFormat (locale = "en_US", value = "# 0,0") public BigDecimal getSalary () {návratový plat; } // štandardní zakladatelia a zakladatelia}
Po serializácii bude objekt tejto triedy vyzerať takto:
{"email": "[email protected]", "id": 1, "person-name": "Jhon", "registeredDate": "07-09-2019", "plat": "1000.0"}
Tu použité anotácie sú:
- @JsonbProperty - ktorý sa používa na zadanie názvu vlastného poľa
- @JsonbTransient - keď chceme pole ignorovať počas deserializácie / serializácie
- @JsonbDateFormat - keď chceme definovať formát zobrazenia dátumu
- @JsonbNumberFormat - na určenie formátu zobrazenia pre číselné hodnoty
- @JsonbNillable - na umožnenie serializácie nulových hodnôt
5.1. Serializácia a deserializácia
Najskôr je potrebné na získanie reprezentácie JSON nášho objektu použiť JsonbBuilder trieda a jej toJson () metóda.
Na začiatok si vytvoríme jednoduchý Osoba objekt takto:
Osoba person = new Person (1, "Jhon", "[email protected]", 20, LocalDate.of (2019, 9, 7), BigDecimal.valueOf (1000));
A vytvoriť inštanciu Jsonb trieda:
Jsonb jsonb = JsonbBuilder.create ();
Potom použijeme toJson metóda:
Reťazec jsonPerson = jsonb.toJson (osoba);
Ak chcete získať nasledujúce zastúpenie JSON:
{"email": "[email protected]", "id": 1, "person-name": "Jhon", "registeredDate": "07-09-2019", "plat": "1000.0"}
Ak chceme urobiť konverziu opačne, môžeme použiť odJsona metóda:
Osoba osoba = jsonb.fromJson (jsonPerson, Person.class);
Prirodzene, môžeme spracovávať aj zbierky:
Zoznam personList = Arrays.asList (...); Reťazec jsonArrayPerson = jsonb.toJson (personList);
Ak chcete získať nasledujúce zastúpenie JSON:
[{"email": "[email protected]", "id": 1, "person-name": "Jhon", "registeredDate": "09-09-2019", "plat": "1000.0"}, {"email": "[email protected]", "id": 2, "person-name": "Jhon", "registeredDate": "09-09-2019", "plat": "1500.0"},. ..]
Ak chcete previesť z poľa JSON na Zoznam použijeme odJsona API:
Zoznam personList = jsonb.fromJson (personJsonArray, nový ArrayList () {}. GetClass (). GetGenericSuperclass ());
5.2. Vlastné mapovanie pomocou JsonbConfig
The JsonbConfig trieda nám umožňuje prispôsobiť proces mapovania pre všetky triedy.
Môžeme napríklad zmeniť predvolené stratégie pomenovania alebo poradie vlastností.
Teraz použijeme LOWER_CASE_WITH_UNDERSCORES stratégia:
JsonbConfig config = nový JsonbConfig (). WithPropertyNamingStrategy (PropertyNamingStrategy.LOWER_CASE_WITH_UNDERSCORES); Jsonb jsonb = JsonbBuilder.create (konfigurácia); Reťazec jsonPerson = jsonb.toJson (osoba);
Ak chcete získať nasledujúce zastúpenie JSON:
{"email": "[email protected]", "id": 1, "person-name": "Jhon", "registered_date": "07-09-2019", "plat": "1000.0"}
Teraz zmeníme poradie vlastnosti pomocou SPÄŤ stratégia. Pri použití tejto stratégie je poradie vlastností v opačnom poradí ako lexikografické.
To možno tiež nakonfigurovať pri kompilácii s anotáciou @JsonbPropertyOrder. Pozrime sa na to v akcii:
JsonbConfig config = nový JsonbConfig (). WithPropertyOrderStrategy (PropertyOrderStrategy.REVERSE); Jsonb jsonb = JsonbBuilder.create (konfigurácia); Reťazec jsonPerson = jsonb.toJson (osoba);
Ak chcete získať nasledujúce zastúpenie JSON:
{"plat": "1000.0", "registeredDate": "07-09-2019", "person-name": "Jhon", "id": 1, "email": "[chránený e-mailom]"}
5.3. Vlastné mapovanie pomocou adaptérov
Keď anotácie a JsonbConfig triedy pre nás nestačí, môžeme použiť adaptéry.
Aby sme ich mohli použiť, budeme musieť implementovať JsonbAdapter rozhranie, ktoré definuje nasledujúce metódy:
- adaptToJson - Pomocou tejto metódy môžeme pre proces serializácie použiť vlastnú logiku konverzie.
- adaptFromJson - Táto metóda nám umožňuje použiť vlastnú logiku konverzie pre proces deserializácie.
Poďme vytvoriť PersonAdapter spracovať id a názov atribúty Osoba trieda:
public class PersonAdapter implementuje JsonbAdapter {@Override public JsonObject adaptToJson (Person p) hodí Exception {return Json.createObjectBuilder () .add ("id", p.getId ()) .add ("name", p.getName ()) .build (); } @Override public Person adaptFromJson (prispôsobený JsonObject) vyvolá výnimku {Person person = new Person (); person.setId (prispôsobené.getInt ("id")); person.setName (prispôsobené.getString ("meno")); návratová osoba; }}
Ďalej priradíme adaptér k nášmu JsonbConfig inštancia:
JsonbConfig config = nový JsonbConfig (). WithAdapters (nový PersonAdapter ()); Jsonb jsonb = JsonbBuilder.create (konfigurácia);
Získame nasledujúce zastúpenie JSON:
{"id": 1, "name": "Jhon"}
6. Záver
V tomto tutoriáli sme videli príklad, ako integrovať API JSON-B s aplikáciami Java pomocou dostupných implementácií, spolu s príkladmi prispôsobenia serializácie a deserializácie pri kompilácii aj za behu.
Celý kód je ako vždy k dispozícii na stránkach Github.