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.