Programování

Java XML a JSON: Zpracování dokumentů pro prostředí Java SE, část 2: JSON-B

V tomto článku budeme pokračovat v prozkoumávání XML a JSON v Javě 11 a dalších.

Příklady v tomto článku vám představí JSON-B, rozhraní JSON Binding API pro Javu. Po krátkém přehledu a pokynech k instalaci vám ukážu, jak používat JSON-B k serializaci a deserializaci Java objektů, polí a kolekcí; jak přizpůsobit serializaci a deserializaci pomocí JSON-B; a jak používat adaptéry JSON-B k převodu zdrojových objektů na cílové objekty během serializace nebo deserializace.

Materiál pro tento článek je zcela nový, ale lze ho považovat za další kapitolu (Kapitola 13) mé nové knihy, kterou nedávno vydalo Apress: Java XML a JSON, druhé vydání.

O knize: Java XML a JSON

Jak jsem sdílel ve svém předchozím článku, Apress právě vydal druhé vydání mé knihy, Java XML a JSON. Bylo mi potěšením napsat celou knihu o XML a JSON, dvou technologiích, které považuji za více doplňkové než konkurenční. Po vydání knihy jsem přidal nové příklady pro kapitolu 6: Transformace dokumentů XML pomocí XSLT a pro kapitolu 11: Zpracování JSON s Jacksonem. Můj poslední článek „Java XML a JSON: Zpracování dokumentů pro prostředí Java SE, část 1“ představil řadu technik transformace a zpracování dokumentů pomocí SAXON a Jackson. Nezapomeňte se podívat na tento článek a dozvědět se více o těchto technikách.

Získejte kód

Stáhněte si zdrojový kód pro příklady použité v tomto výukovém programu.

Co je JSON-B?

JSON-B je standardní vazebná vrstva a rozhraní API pro převod objektů Java do az dokumentů JSON. Je to podobné jako Java Architecture for XML Binding (JAXB), která se používá k převodu objektů Java na az XML.

JSON-B je postaven na JSON-P, JSON Processing API používaném pro analýzu, generování, dotazování a transformaci dokumentů JSON. JSON-B byl představen Java Specification Request (JSR) 367 více než rok po finálním vydání JSR 353, JSR pro JSON-P.

API JSON-B

Web Java API pro vazbu JSON (JSON-B) zavádí JSON-B a poskytuje přístup k různým zdrojům, včetně dokumentace API. Podle dokumentace modul JSON-B ukládá šest balíčků:

  • javax.json.bind: Definuje vstupní bod pro vazbu objektů Java k dokumentům JSON.
  • javax.json.bind.adaptér: Definuje třídy související s adaptérem.
  • javax.json.bind.annotation: Definuje anotace pro přizpůsobení mapování mezi prvky programu Java a dokumenty JSON.
  • javax.json.bind.config: Definuje strategie a zásady pro přizpůsobení mapování mezi prvky programu Java a dokumenty JSON.
  • javax.json.bind.serializer: Definuje rozhraní pro vytváření vlastních serializátorů a deserializátorů.
  • javax.json.bind.spi: Definuje rozhraní poskytovatele služeb (SPI) pro vlastní připojení JsonbBuilders.

Web JSON-B také poskytuje odkaz na Yasson, rámec Java, který poskytuje standardní vrstvu vazby mezi třídami Java a dokumenty JSON, a oficiální referenční implementaci rozhraní JSON Binding API.

JSON-B a Java EE 8

Stejně jako JSON-P, i ​​JSON-B byl původně zvažován pro zařazení do Java SE, ale místo toho byl zahrnut do vydání Java EE 8. Stále však můžete s JSON-B pracovat v kontextu Java SE.

Stáhněte a nainstalujte JSON-B

JSON-B 1.0 je v době psaní aktuální verze. Referenční implementaci této knihovny Yasson můžete získat z úložiště Maven. Budete si muset stáhnout následující soubory JAR:

  • Javax JSON Bind API 1.0: Obsahuje všechny soubory tříd JSON-B. stáhnul jsem javax.json.bind-api-1.0.jar.
  • Yasson: Obsahuje referenční implementaci JSON-B založenou na Eclipse. stáhnul jsem yasson-1.0.3.jar.
  • Výchozí poskytovatel JSR 374 (JSON Processing): Obsahuje všechny soubory tříd JSON-P 1.0 spolu s výchozími třídami souborů poskytovatele Glassfish. stáhnul jsem javax.json-1.1.4.jar.

Přidejte tyto soubory JAR do své cesty ke třídě při kompilaci a spuštění kódu, který používá tyto knihovny:

javac -cp javax.json.bind-api-1.0.jar ;. hlavní zdrojový soubor java -cp javax.json.bind-api-1.0.jar; yasson-1.0.3.jar; javax.json-1.1.4.jar ;. hlavní třídní soubor

Serializace a deserializace objektů Java pomocí JSON-B

The javax.json.bind balíček poskytuje Jsonb a JsonbBuilder rozhraní, která slouží jako vstupní bod do této knihovny:

  • Jsonb poskytuje přetížené toJson () metody pro serializaci stromů objektů Java do dokumentů JSON a fromJson () metody deserializace dokumentů JSON na stromy objektů Java.
  • JsonbBuilder poskytuje newBuilder () a další metody pro získání nového tvůrce a stavět() a vytvořit() metody vrácení nového Jsonb předměty.

Následující příklad kódu ukazuje základní použití Jsonb a JsonBuilder typy:

// Vytvořte novou instanci Jsonb pomocí výchozí implementace JsonbBuilder. Jsonb jsonb = JsonbBuilder.create (); // Vytvořte objekt Employee z hypotetické třídy Employee. Employee employee = ... // Převede objekt Employee na dokument JSON uložený v řetězci. Řetězec jsonEmployee = jsonb.toJson (zaměstnanec); // Převést dříve vytvořený dokument JSON na objekt Employee. Zaměstnanec zaměstnanec2 = jsonb.fromJson (jsonEmployee, Employee.class);

Tento příklad vyvolá Jsonbje String toJson (Object object) metoda pro serializaci objektu Java, (Zaměstnanec). Tato metoda je předána kořenu stromu objektů Java k serializaci. Li nula je předán, toJson () hodí java.lang.NullPointerException. Hází to javax.json.bind.JsonbException když se během serializace vyskytne neočekávaný problém (například chyba I / O).

Tento fragment kódu také vyvolá Jsonbje T fromJson (String str, Class type) obecná metoda, která se používá pro deserializaci. Tato metoda je předána dokumentu JSON založenému na řetězci k deserializaci a typu kořenového objektu výsledného stromu objektů Java, který je vrácen. Tato metoda hodí NullPointerException když nula je předán kterémukoli parametru; to hodí JsonbException když během deserializace dojde k neočekávanému problému.

Vyňal jsem fragment kódu z a JSONBDemo aplikace, která poskytuje základní ukázku JSON-B. Výpis 1 představuje zdrojový kód této ukázky.

Výpis 1. JSONBDemo.java (verze 1)

importovat 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 (); Zaměstnanec zaměstnanec = nový zaměstnanec („John“, „Doe“, 123456789, false, LocalDate.of (1980, 12, 23), LocalDate.of (2002, 8, 14)); Řetězec jsonEmployee = jsonb.toJson (zaměstnanec); System.out.println (jsonEmployee); System.out.println (); Zaměstnanec zaměstnanec2 = jsonb.fromJson (jsonEmployee, Employee.class); System.out.println (employee2); }}

hlavní() nejprve vytvoří Jsonb objekt následovaný Zaměstnanec objekt. Pak zavolá toJson () serializovat Zaměstnanec namítat na dokument JSON, který je uložen v řetězci. Po vytištění tohoto dokumentu hlavní() vyvolává fromJson () s předchozím řetězcem a Zaměstnanecje java.lang.Class objekt k deserializaci dokumentu JSON na jiný Zaměstnanec objekt, který je následně vytištěn.

Seznam 2 dárků Zaměstnaneczdrojový kód.

Výpis 2. Employee.java (verze 1)

importovat java.time.LocalDate; veřejná třída Zaměstnanec {private String firstName; private String lastName; soukromý int ssn; soukromý boolean je ženatý; private LocalDate datum narození; 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 = příjmení; this.ssn = ssn; this.isMarried = isMarried; this.birthDate = datum narození; this.hireDate = hireDate; } public String getFirstName () {návrat křestní jméno; } public String getLastName () {návrat příjmení; } public int getSSN () {return ssn; } public boolean isMarried () {return isMarried; } public LocalDate getBirthDate () {návrat birthDate; } public LocalDate getHireDate () {return hireDate; } public void setFirstName (řetězec firstName) {this.firstName = firstName; } public void setLastName (řetězec lastName) {this.lastName = lastName; } 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 ("Křestní jméno ["); sb.append (jméno); sb.append ("], příjmení ["); sb.append (příjmení); sb.append ("], SSN ["); sb.append (ssn); sb.append ("], ženatý ["); sb.append (isMarried); sb.append ("], datum narození ["); sb.append (datum narození); sb.append ("], Hiredate ["); sb.append (hireDate); sb.append ("]"); vrátit sb.toString (); }}

Zkompilujte výpisy 1 a 2 následujícím způsobem:

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

Spusťte aplikaci následujícím způsobem:

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

Měli byste dodržovat následující výstup (pro lepší čitelnost rozložený na více řádcích):

{"SSN": 123456789, "birthDate": "1980-12-23", "firstName": "John", "hireDate": "2002-08-14", "lastName": "Doe", "ženatý" : false} Jméno [John], příjmení [Doe], SSN [123456789], ženatý [false], datum narození [23.12.1980], nájemce [2002-08-14] 

Pravidla pro práci s JSON-B

Při hraní s touto aplikací jsem pozoroval několik zajímavých chování, které mě vedly k formulaci následujících pravidel týkajících se Zaměstnanec:

  • Třída musí být veřejnost; jinak je vyvolána výjimka.
  • toJson () nebude serializovat pole s non-veřejnost metody getru.
  • fromJson () nebude deserializovat pole s non-veřejnost metody seřizovače.
  • fromJson () hodí JsonbException v nepřítomnosti a veřejný noargument konstruktor.

Aby bylo možné bezproblémově převádět mezi poli objektů Java a daty JSON, musí JSON-B podporovat různé typy Java. Například JSON-B podporuje následující základní typy Java:

  • java.lang.Boolean
  • java.lang.Byte
  • java.lang. znak
  • java.lang.Double
  • java.lang.Float
  • java.lang.Integer
  • java.lang.Long
  • java.lang. krátká
  • řetězec java.lang

Další typy jako java.math.BigInteger, java.util.Date, a java.time.LocalDate jsou podporovány. Podívejte se na specifikaci JSON-B pro úplný seznam podporovaných typů.

Serializace a deserializace polí a kolekcí pomocí JSON-B

Předchozí část se zaměřila na serializaci a deserializaci jednotlivých objektů Java. JSON-B také podporuje schopnost serializovat a deserializovat pole a kolekce objektů. Výpis 3 poskytuje ukázku.

Výpis 3. JSONBDemo.java (verze 2)

importovat java.time.LocalDate; import java.util.ArrayList; import 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 objektů zaměstnanců. static void arrayDemo () {Jsonb jsonb = JsonbBuilder.create (); Zaměstnanec [] zaměstnanci = {nový zaměstnanec ("John", "Doe", 123456789, false, LocalDate.of (1980, 12, 23), LocalDate.of (2002, 8, 14)), nový zaměstnanec ("Jane" , "Smith", 987654321, true, LocalDate.of (1982, 6, 13), LocalDate.of (2001, 2, 9))}; Řetězec jsonEmployees = jsonb.toJson (zaměstnanci); System.out.println (jsonEmployees); System.out.println (); zaměstnanci = null; zaměstnanci = jsonb.fromJson (jsonEmployees, zaměstnanec []. třída); pro (Zaměstnanec zaměstnance: zaměstnanci) {System.out.println (zaměstnanec); System.out.println (); }} // Serializace a deserializace seznamu objektů zaměstnanců. static void listDemo () {Jsonb jsonb = JsonbBuilder.create (); Seznam zaměstnanců = Arrays.asList (nový zaměstnanec ("John", "Doe", 123456789, false, LocalDate.of (1980, 12, 23), LocalDate.of (2002, 8, 14)), nový zaměstnanec ("Jane "," Smith ", 987654321, true, LocalDate.of (1982, 6, 13), LocalDate.of (1999, 7, 20))); Řetězec jsonEmployees = jsonb.toJson (zaměstnanci); System.out.println (jsonEmployees); System.out.println (); zaměstnanci = null; zaměstnanci = jsonb.fromJson (jsonEmployees, nový ArrayList () {}. getClass (). getGenericSuperclass ()); System.out.println (zaměstnanci); }}

Výpis 3 je jednoduché rozšíření výpisu 1 a používá ho stejně Zaměstnanec třída uvedená v seznamu 2. Navíc tento příklad kódu volá stejně toJson () a fromJson () metody.