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é pripojenieJsonbBuilder
s.
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
poskytujenewBuilder ()
a ďalšie metódy na získanie nového staviteľa abuild ()
avytvoriť ()
metódy návratu novýchJsonb
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 Jsonb
je 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á Jsonb
je 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 Zamestnanec
je java.lang.Class
objekt na deserializáciu dokumentu JSON na iný Zamestnanec
objekt, ktorý je následne vytlačený.
Zoznam 2 darčekov Zamestnanec
zdrojový 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 averejný 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.Date
a 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.