Bevezetés a JSON Binding API-ba (JSR 367) a Java-ban

1. Áttekintés

Sokáig nem volt szabvány a JSON-feldolgozásra a Java-ban. A JSON feldolgozásához használt leggyakoribb könyvtárak a Jackson és a Gson.

A közelmúltban a Java EE7 API-val érkezett a JSON elemzéséhez és előállításához (JSR 353: Java API JSON Processinghez).

Végül a JEE 8 kiadásával egy szabványosított API (JSR 367: Java API JSON Binding (JSON-B)).

Jelenleg fő megvalósításai az Eclipse Yasson (RI) és az Apache Johnzon.

2. JSON-B API

2.1. Maven-függőség

Kezdjük a szükséges függőség hozzáadásával.

Ne feledje, hogy sok esetben elegendő a választott megvalósítás és az javax.json.bind-api átmeneti jelleggel:

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

A legfrissebb verzió a Maven Central oldalon található.

3. Az Eclipse Yasson használata

Az Eclipse Yasson a hivatalos referencia-megvalósítás a JSON Binding API (JSR-367).

3.1. Maven-függőség

Használatához a következő függőségeket kell beépítenünk a Maven projektünkbe:

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

A legújabb verziók a Maven Central oldalon találhatók.

4. Apache Johnzon használata

Egy másik megvalósítás, amelyet használhatunk, az Apache Johnzon, amely megfelel a JSON-P (JSR-353) és a JSON-B (JSR-367) API-knak.

4.1. Maven-függőség

Használatához a következő függőségeket kell beépítenünk a Maven projektünkbe:

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

A legújabb verziók a Maven Central oldalon találhatók.

5. API jellemzők

Az API megjegyzéseket nyújt a sorosítás / deserializálás testreszabásához.

Hozzunk létre egy egyszerű osztályt, és nézzük meg, hogyan néz ki a példa konfiguráció:

public class Személy {private int id; @JsonbProperty ("személynév") privát karakterlánc neve; @JsonbProperty (nillable = true) privát karakterlánc e-mail; @JsonbTransient private int age; @JsonbDateFormat ("éééé-hh-ééééééééééé)" privát LocalDate regisztráltDátum magán BigDecimal fizetés; @JsonbNumberFormat (locale = "en_US", value = "# 0.0") public BigDecimal getSalary () {visszatérési fizetés; } // szokásos mérőeszközök és beállítók}

A sorosítást követően egy ilyen osztályú objektum a következőképpen néz ki:

{"email": "[email protected]", "id": 1, "person-name": "Jhon", "registerDate": "2019-09-07", "fizetés": "1000.0"}

Az itt használt kommentárok a következők:

  • @JsonbProperty - amely az egyedi mezőnév megadására szolgál
  • @JsonbTransient - amikor a terepesítés / sorosítás során figyelmen kívül akarjuk hagyni a mezőt
  • @JsonbDateFormat - amikor meg akarjuk határozni a dátum megjelenítési formátumát
  • @JsonbNumberFormat - a számértékek megjelenítési formátumának megadásához
  • @JsonbNillable - a nullértékek sorosításához

5.1. Serializáció és deserializáció

Először is, az objektumunk JSON reprezentációjának megszerzéséhez a JsonbBuilder osztály és annak toJson () módszer.

Először hozzunk létre egy egyszerű Személy ilyen tárgy:

Személy személy = új Személy (1, "Jhon", "[e-mail védett]", 20, LocalDate.of (2019, 9, 7), BigDecimal.valueOf (1000));

És példázza a Jsonb osztály:

Jsonb jsonb = JsonbBuilder.create ();

Ezután használjuk a Jsonnak módszer:

Karakterlánc jsonPerson = jsonb.toJson (személy);

A következő JSON-reprezentáció megszerzéséhez:

{"email": "[email protected]", "id": 1, "person-name": "Jhon", "registerDate": "2019-09-07", "fizetés": "1000.0"}

Ha a konverziót más módon akarjuk elvégezni, használhatjuk a Json-tól módszer:

Személy személy = jsonb.jsonból (jsonPerson, Személyosztály);

Természetesen feldolgozhatjuk a gyűjteményeket is:

List personList = Tömbök.asList (...); Karakterlánc jsonArrayPerson = jsonb.toJson (personList);

A következő JSON-ábrázolás megszerzéséhez:

[{"email": "[email protected]", "id": 1, "person-name": "Jhon", "registerDate": "2019-09-09", "fizetés": "1000.0"}, {"email": "[email protected]", "id": 2, "person-name": "Jhon", "registerDate": "09-09-2019", "fizetés": "1500.0"},. ..]

Átalakítás JSON tömbből Lista használjuk a Json-tól API:

List personList = jsonb.fromJson (personJsonArray, új ArrayList () {}. GetClass (). GetGenericSuperclass ());

5.2. Egyéni leképezés JsonbConfig

A JsonbConfig osztály lehetővé teszi számunkra, hogy az összes osztályhoz hozzárendeljük a leképezési folyamatot.

Megváltoztathatjuk például az alapértelmezett elnevezési stratégiákat vagy a tulajdonságok sorrendjét.

Most használjuk a LOWER_CASE_WITH_UNDERSCORES stratégia:

JsonbConfig config = new JsonbConfig (). WithPropertyNamingStrategy (PropertyNamingStrategy.LOWER_CASE_WITH_UNDERSCORES); Jsonb jsonb = JsonbBuilder.create (config); Karakterlánc jsonPerson = jsonb.toJson (személy);

A következő JSON-ábrázolás megszerzéséhez:

{"email": "[email protected]", "id": 1, "person-name": "Jhon", "register_date": "2019-09-07", "fizetés": "1000.0"}

Most megváltoztatjuk az ingatlan sorrendjét a FORDÍTOTT stratégia. Ezzel a stratégiával a tulajdonságok sorrendje fordított sorrendben van a lexikográfiai sorrendben.

Ez fordításkor is konfigurálható az annotációval @JsonbPropertyOrder. Lássuk működés közben:

JsonbConfig config = new JsonbConfig (). WithPropertyOrderStrategy (PropertyOrderStrategy.REVERSE); Jsonb jsonb = JsonbBuilder.create (config); Karakterlánc jsonPerson = jsonb.toJson (személy); 

A következő JSON-ábrázolás megszerzéséhez:

{"fizetés": "1000.0", "registerDate": "2019-09-07", "személynév": "Jhon", "id": 1, "email": "[email protected]"}

5.3. Egyéni feltérképezés adapterekkel

Amikor a kommentárok és a JsonbConfig osztály nem elég nekünk, használhatunk adaptereket.

Ahhoz, hogy felhasználhassuk őket, végre kell hajtanunk a JsonbAdapter interfész, amely a következő módszereket határozza meg:

  • adaptToJson - Ezzel a módszerrel egyedi átalakítási logikát használhatunk a sorosítási folyamathoz.
  • adaptFromJson-tól - Ez a módszer lehetővé teszi számunkra, hogy egyedi átalakítási logikát alkalmazzunk a deserializációs folyamathoz.

Hozzunk létre egy PersonAdapter hogy feldolgozza a id és név tulajdonságai a Személy osztály:

public class PersonAdapter megvalósítja a JsonbAdapter {@Orride public JsonObject adaptToJson (p személy) dobja a Kivételt {return Json.createObjectBuilder () .add ("id", p.getId ()) .add ("név", p.getName ()) .épít(); } @Orride public Person adaptFromJson (JsonObject adaptált) dobja a Kivételt {Person person = new Person (); person.setId (adaptált.getInt ("id")); person.setName (adaptált.getString ("név")); visszatérő személy; }}

Ezenkívül az adaptert hozzárendeljük a sajátunkhoz JsonbConfig példa:

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

És megkapjuk a következő JSON képviseletet:

{"id": 1, "név": "Jhon"}

6. Következtetés

Ebben az oktatóanyagban láttunk egy példát arra, hogyan lehet a JSON-B API-t integrálni a Java alkalmazásokba a rendelkezésre álló megvalósítások felhasználásával, valamint példákat a szerializálás és a deserializáció testreszabására fordításkor és futás közben is.

A teljes kód, mint mindig, elérhető a Githubon.