Ú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.


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