Programovanie

Java XML a JSON: Spracovanie dokumentov pre Java SE, časť 2: JSON-B

V tomto článku budeme pokračovať v skúmaní XML a JSON v prostredí Java 11 a ďalších.

Príklady v tomto článku vám predstavia JSON-B, rozhranie JSON Binding API pre Java. Po krátkom prehľade a pokynoch na inštaláciu vám ukážem, ako používať JSON-B na serializáciu a deserializáciu Java objektov, polí a kolekcií; ako prispôsobiť serializáciu a deserializáciu pomocou JSON-B; a ako používať adaptéry JSON-B na konverziu zdrojových objektov na cieľové objekty počas serializácie alebo deserializácie.

Materiál pre tento článok je úplne nový, ale mohol by sa považovať za ďalšiu kapitolu (kapitola 13) mojej novej knihy, ktorú nedávno vydala spoločnosť Apress: Java XML a JSON, druhé vydanie.

O knihe: Java XML a JSON

Ako som zdieľal v mojom predchádzajúcom článku, Apress práve vydal druhé vydanie mojej knihy, Java XML a JSON. Bolo mi potešením napísať celú knihu o XML a JSON, dvoch technológiách, ktoré považujem za viac komplementárne ako konkurenčné. Po vydaní knihy som pridal nové príklady pre kapitolu 6: Transformácia dokumentov XML pomocou XSLT a pre kapitolu 11: Spracovanie JSON s Jacksonom. Môj posledný článok „Java XML a JSON: Spracovanie dokumentov pre Java SE, časť 1“ predstavil rôzne techniky transformácie a spracovania dokumentov pomocou programov SAXON a Jackson. Nezabudnite sa pozrieť na tento článok, kde sa dozviete viac o týchto technikách.

Získajte kód

Stiahnite si zdrojový kód pre príklady použité v tomto návode.

Čo je to JSON-B?

JSON-B je štandardná väzobná vrstva a API na konverziu objektov Java do az dokumentov JSON. Je to podobné ako architektúra Java Architecture for XML Binding (JAXB), ktorá sa používa na prevod objektov Java do az XML.

JSON-B je postavený na vrchole JSON-P, API JSON Processing, ktoré sa používa na analýzu, generovanie, dopytovanie a transformáciu dokumentov JSON. JSON-B bol predstavený Java Specification Request (JSR) 367 viac ako rok po finálnom vydaní JSR 353, JSR pre JSON-P.

Rozhranie JSON-B API

Webové rozhranie Java API for JSON Binding (JSON-B) predstavuje JSON-B a poskytuje prístup k rôznym zdrojom vrátane dokumentácie API. Podľa dokumentácie obsahuje modul JSON-B šesť balíkov:

  • javax.json.bind: Definuje vstupný bod pre väzbu objektov Java na dokumenty JSON.
  • javax.json.bind.adaptér: Definuje triedy súvisiace s adaptérom.
  • javax.json.bind.annotation: Definuje anotácie na prispôsobenie mapovania medzi prvkami programu Java a dokumentmi JSON.
  • javax.json.bind.config: Definuje stratégie a politiky na prispôsobenie mapovania medzi prvkami programu Java a dokumentmi JSON.
  • javax.json.bind.serializer: Definuje rozhrania na vytváranie vlastných serializátorov a deserializátorov.
  • javax.json.bind.spi: Definuje rozhranie poskytovateľa služieb (SPI) pre vlastné pripojenie JsonbBuilders.

Webová stránka JSON-B tiež poskytuje odkaz na Yasson, rámec Java, ktorý poskytuje štandardnú väzobnú vrstvu medzi triedami Java a dokumentmi JSON, a oficiálnu referenčnú implementáciu rozhrania JSON Binding API.

JSON-B a Java EE 8

Rovnako ako JSON-P, aj JSON-B sa pôvodne zvažoval pre zahrnutie do Java SE, ale namiesto toho bol zahrnutý do vydania Java EE 8. S JSON-B však môžete stále pracovať v kontexte Java SE.

Stiahnite a nainštalujte JSON-B

JSON-B 1.0 je aktuálna verzia v čase písania tohto článku. Referenčnú implementáciu tejto knižnice od spoločnosti Yasson môžete získať z úložiska Maven. Budete si musieť stiahnuť nasledujúce súbory JAR:

  • Javax JSON Bind API 1.0: Obsahuje všetky súbory JSON-B. Stiahla som javax.json.bind-api-1.0.jar.
  • Yasson: Obsahuje referenčnú implementáciu JSON-B založenú na Eclipse. Stiahla som yasson-1.0.3.jar.
  • Predvolený poskytovateľ JSR 374 (JSON Processing): Obsahuje všetky súbory JSON-P 1.0 spolu s triedami súborov predvoleného poskytovateľa Glassfish. Stiahla som javax.json-1.1.4.jar.

Pri kompilácii a spustení kódu, ktorý používa tieto knižnice, pridajte tieto súbory JAR do svojej cesty k triede:

javac -cp javax.json.bind-api-1.0.jar ;. hlavný zdrojový súbor java -cp javax.json.bind-api-1.0.jar; yasson-1.0.3.jar; javax.json-1.1.4.jar ;. hlavný triedny súbor

Serializácia a deserializácia objektov Java pomocou JSON-B

The javax.json.bind balíček poskytuje Jsonb a JsonbBuilder rozhrania, ktoré slúžia ako vstupný bod do tejto knižnice:

  • Jsonb poskytuje preťažený toJson () - metódy na serializáciu stromov objektov Java do dokumentov JSON a - fromJson () metódy deserializácie dokumentov JSON na stromy objektov Java.
  • JsonbBuilder poskytuje newBuilder () a ďalšie metódy na získanie nového staviteľa a build () a vytvoriť () metódy návratu nových Jsonb predmety.

Nasledujúci príklad kódu demonštruje základné použitie Jsonb a JsonBuilder typy:

// Vytvorte novú inštanciu Jsonb pomocou predvolenej implementácie JsonbBuilder. Jsonb jsonb = JsonbBuilder.create (); // Vytvorenie objektu Employee z hypotetickej triedy Employee. Employee employee = ... // Konvertuje objekt Employee na dokument JSON uložený v reťazci. Reťazec jsonEmployee = jsonb.toJson (zamestnanec); // Konverzia predtým vytvoreného dokumentu JSON na objekt Employee. Zamestnanec zamestnanec2 = jsonb.fromJson (jsonEmployee, Employee.class);

Tento príklad vyvoláva Jsonbje Reťazec toJson (objekt objektu) metóda na serializáciu objektu Java, (Zamestnanec). Táto metóda je odovzdaná koreňu stromu objektov Java na serializáciu. Ak nulový je odovzdaný, toJson () hodí java.lang.NullPointerException. Vrhá to javax.json.bind.JsonbException keď sa počas serializácie vyskytne neočakávaný problém (napríklad chyba I / O).

Tento fragment kódu sa tiež vyvolá Jsonbje T fromJson (String str, Class type) generická metóda, ktorá sa používa na deserializáciu. Táto metóda sa odovzdá reťazcovému dokumentu JSON na deserializáciu a typu koreňového objektu výsledného stromu objektov Java, ktorý sa vráti. Táto metóda hodí NullPointerException kedy nulový je odovzdaný ktorémukoľvek parametru; hodí to JsonbException keď sa počas deserializácie vyskytne neočakávaný problém.

Vyňal som fragment kódu z a JSONBDemo aplikácia, ktorá poskytuje základnú ukážku JSON-B. Zoznam 1 predstavuje zdrojový kód tejto ukážky.

Zoznam 1. JSONBDemo.java (verzia 1)

import java.time.LocalDate; import javax.json.bind.Jsonb; import javax.json.bind.JsonbBuilder; public class JSONBDemo {public static void main (String [] args) {Jsonb jsonb = JsonbBuilder.create (); Zamestnanec zamestnanec = nový zamestnanec („John“, „Doe“, 123456789, false, LocalDate.of (1980, 12, 23), LocalDate.of (2002, 8, 14)); Reťazec jsonEmployee = jsonb.toJson (zamestnanec); System.out.println (jsonEmployee); System.out.println (); Zamestnanec zamestnanec2 = jsonb.fromJson (jsonEmployee, Employee.class); System.out.println (zamestnanec2); }}

hlavný() najskôr vytvorí a Jsonb objekt, za ktorým nasleduje Zamestnanec objekt. Potom zavolá toJson () na pokračovanie Zamestnanec namietajte proti dokumentu JSON, ktorý je uložený v reťazci. Po vytlačení tohto dokumentu hlavný() privoláva fromJson () s predchádzajúcim reťazcom a Zamestnanecje java.lang.Class objekt na deserializáciu dokumentu JSON na iný Zamestnanec objekt, ktorý je následne vytlačený.

Zoznam 2 darčekov Zamestnaneczdrojový kód.

Zoznam 2. Employee.java (verzia 1)

import java.time.LocalDate; verejná trieda Zamestnanec {private String meno; private String priezvisko; súkromné ​​int ssn; súkromný boolean je ženatý; private LocalDate dátum narodenia; private LocalDate hireDate; private StringBuffer sb = nový StringBuffer (); public Employee () {} public Employee (String firstName, String lastName, int ssn, boolean isMarried, LocalDate birthDate, LocalDate hireDate) {this.firstName = firstName; this.lastName = priezvisko; this.ssn = ssn; this.isMarried = isMarried; this.birthDate = dátum narodenia; this.hireDate = hireDate; } public String getFirstName () {return meno; } public String getLastName () {návrat priezvisko; } public int getSSN () {return ssn; } public boolean isMarried () {return isMarried; } public LocalDate getBirthDate () {návrat birthDate; } public LocalDate getHireDate () {return hireDate; } public void setFirstName (reťazec firstName) {this.firstName = firstName; } public void setLastName (reťazec priezvisko) {this.lastName = priezvisko; } public void setSSN (int ssn) {this.ssn = ssn; } public void setIsMarried (boolean isMarried) {this.isMarried = isMarried; } public void setBirthDate (LocalDate birthDate) {this.birthDate = birthDate; } public void setHireDate (LocalDate hireDate) {this.hireDate = hireDate; } @Override public String toString () {sb.setLength (0); sb.append ("Meno ["); sb.append (meno); sb.append ("], Priezvisko ["); sb.append (priezvisko); sb.append ("], SSN ["); sb.append (ssn); sb.append ("], ženatý ["); sb.append (isMarried); sb.append ("], dátum narodenia ["); sb.append (dátum narodenia); sb.append ("], Hiredate ["); sb.append (hireDate); sb.append ("]"); vrátiť sb.toString (); }}

Zostavte zoznamy 1 a 2 takto:

javac -cp javax.json.bind-api-1.0.jar ;. JSONBDemo.java

Spustite aplikáciu nasledovne:

java -cp javax.json.bind-api-1.0.jar; yasson-1.0.3.jar; javax.json-1.1.4.jar ;. JSONBDemo

Mali by ste dodržiavať nasledujúci výstup (kvôli čitateľnosti rozložený na viac riadkov):

{"SSN": 123456789, "birthDate": "1980-12-23", "firstName": "John", "hireDate": "2002-08-14", "lastName": "Doe", "ženatý" : false} Meno [John], Priezvisko [Doe], SSN [123456789], Ženatý [false], Dátum narodenia [23.12.1980], Nájomník [2002-08-14] 

Pravidlá pre prácu s JSON-B

Pri hraní s touto aplikáciou som spozoroval niekoľko zaujímavých správaní, ktoré ma viedli k formulovaniu nasledujúcich nasledujúcich pravidiel Zamestnanec:

  • Trieda musí byť verejné; inak sa vyvolá výnimka.
  • toJson () nebude serializovať polia sverejné getrové metódy.
  • fromJson () nebude rekonštruovať polia sverejné nastavovacie metódy.
  • fromJson () hodí JsonbException pri absencii a verejný noargument konštruktér.

Aby bolo možné plynulo prevádzať medzi poľami objektov Java a dátami JSON, musí JSON-B podporovať rôzne typy Javy. Napríklad JSON-B podporuje nasledujúce základné typy Java:

  • java.lang.Boolean
  • java.lang.Byte
  • java.lang.Postava
  • java.lang.Double
  • java.lang.Float
  • java.lang.Integer
  • java.lang.Dlhé
  • java.lang.Skratka
  • java.lang.String

Doplnkové typy ako napr java.math.BigInteger, java.util.Datea java.time.LocalDate sú podporované. Kompletný zoznam podporovaných typov nájdete v špecifikácii JSON-B.

Serializácia a deserializácia polí a kolekcií pomocou JSON-B

Predchádzajúca časť bola zameraná na serializáciu a deserializáciu jednotlivých objektov Java. JSON-B tiež podporuje schopnosť serializovať a deserializovať polia a kolekcie objektov. Zoznam 3 poskytuje ukážku.

Zoznam 3. JSONBDemo.java (verzia 2)

import java.time.LocalDate; import java.util.ArrayList; importovať java.util.Arrays; import java.util.List; import javax.json.bind.Jsonb; import javax.json.bind.JsonbBuilder; public class JSONBDemo {public static void main (String [] args) {arrayDemo (); listDemo (); } // Serializuje a deserializuje pole objektov zamestnancov. static void arrayDemo () {Jsonb jsonb = JsonbBuilder.create (); Zamestnanec [] zamestnanci = {nový zamestnanec ("John", "Doe", 123456789, false, LocalDate.of (1980, 12, 23), LocalDate.of (2002, 8, 14)), nový zamestnanec ("Jane" , "Smith", 987654321, true, LocalDate.of (1982, 6, 13), LocalDate.of (2001, 2, 9))}; Reťazec jsonEmployees = jsonb.toJson (zamestnanci); System.out.println (jsonEmployees); System.out.println (); zamestnanci = null; zamestnanci = jsonb.fromJson (jsonEmployees, zamestnanec []. trieda); pre (Zamestnanec zamestnanec: zamestnanci) {System.out.println (zamestnanec); System.out.println (); }} // Serializuje a deserializuje zoznam objektov zamestnancov. static void listDemo () {Jsonb jsonb = JsonbBuilder.create (); Zoznam zamestnancov = Arrays.asList (nový zamestnanec ("John", "Doe", 123456789, false, LocalDate.of (1980, 12, 23), LocalDate.of (2002, 8, 14)), nový zamestnanec ("Jane "," Smith ", 987654321, true, LocalDate.of (1982, 6, 13), LocalDate.of (1999, 7, 20))); Reťazec jsonEmployees = jsonb.toJson (zamestnanci); System.out.println (jsonEmployees); System.out.println (); zamestnanci = null; zamestnanci = jsonb.fromJson (jsonEmployees, nový ArrayList () {}. getClass (). getGenericSuperclass ()); System.out.println (zamestnanci); }}

Zoznam 3 je jednoduché rozšírenie záznamu 1 a používa ho rovnako Zamestnanec trieda uvedená v zozname 2. Ďalej tento príklad kódu volá rovnako toJson () a fromJson () metódy.

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