Programiranje

Java XML in JSON: Obdelava dokumentov za Java SE, 2. del: JSON-B

V tem članku bomo nadaljevali z raziskovanjem XML in JSON v Javi 11 in novejših različicah.

Primeri v tem članku vam bodo predstavili JSON-B, JSON Binding API za Javo. Po kratkem pregledu in navodilih za namestitev vam bom pokazal, kako uporabljati JSON-B za serializacijo in deserializacijo predmetov, nizov in zbirk Java; kako prilagoditi serializacijo in deserializacijo z uporabo JSON-B; in kako uporabiti adapterje JSON-B za pretvorbo izvornih predmetov v ciljne predmete med serializacijo ali deserializacijo.

Gradivo za ta članek je povsem novo, vendar bi ga lahko obravnavali kot dodatno poglavje (poglavje 13) za mojo novo knjigo, ki jo je Apress pred kratkim objavil: Java XML in JSON, druga izdaja.

O knjigi: Java XML in JSON

Kot sem že povedal v prejšnjem članku, je Apress pravkar objavil drugo izdajo moje knjige, Java XML in JSON. V veselje mi je bilo napisati celo knjigo o XML in JSON, dveh tehnologijah, ki se mi zdijo bolj komplementarne kot konkurenčne. Po izidu knjige sem dodal nove primere za poglavje 6: Preoblikovanje dokumentov XML z XSLT in za poglavje 11: Obdelava JSON z Jacksonom. Moj zadnji članek "Java XML in JSON: Obdelava dokumentov za Java SE, 1. del" je predstavil različne tehnike preoblikovanja in obdelave dokumentov s pomočjo SAXON in Jackson. Ne pozabite si ogledati tega članka, če želite izvedeti več o teh tehnikah.

Pridobite kodo

Prenesite izvorno kodo za primere, uporabljene v tej vadnici.

Kaj je JSON-B?

JSON-B je standardni vezavni sloj in API za pretvorbo predmetov Java v in iz dokumentov JSON. Podobno je Java Architecture for XML Binding (JAXB), ki se uporablja za pretvorbo predmetov Java v in iz XML.

JSON-B je zgrajen na JSON-P, JSON Processing API, ki se uporablja za razčlenjevanje, ustvarjanje, poizvedovanje in pretvorbo dokumentov JSON. JSON-B je bila uvedena z zahtevo za specifikacijo Java (JSR) 367 več kot leto dni po končni izdaji JSR 353, JSR za JSON-P.

API JSON-B

Spletno mesto Java API za vezavo JSON (JSON-B) uvaja JSON-B in omogoča dostop do različnih virov, vključno z dokumentacijo API. V skladu z dokumentacijo modul JSON-B shrani šest paketov:

  • javax.json.bind: Določi vstopno točko za vezavo predmetov Java na dokumente JSON.
  • javax.json.bind.adapter: Definira razrede, povezane z adapterji.
  • javax.json.bind.annotation: Določi pripise za prilagajanje preslikave med elementi programa Java in dokumenti JSON.
  • javax.json.bind.config: Določa strategije in usmeritve za prilagajanje preslikave med elementi programa Java in dokumenti JSON.
  • javax.json.bind.serializer: Določa vmesnike za ustvarjanje serializatorjev in deserializatorjev po meri.
  • javax.json.bind.spi: Določi vmesnik ponudnika storitev (SPI) za priklop po meri JsonbBuilders.

Spletno mesto JSON-B ponuja tudi povezavo do Yassona, ogrodja Java, ki zagotavlja standardni vezni sloj med razredi Java in dokumenti JSON ter uradno referenčno izvedbo API-ja za vezavo JSON.

JSON-B in Java EE 8

Tako kot JSON-P je bil tudi JSON-B prvotno vključen v Java SE, vendar je bil namesto tega vključen v izdajo Java EE 8. Vendar lahko še vedno delate z JSON-B v kontekstu Java SE.

Prenesite in namestite JSON-B

JSON-B 1.0 je trenutna različica v času pisanja. Yassonovo referenčno izvedbo te knjižnice lahko dobite v repozitoriju Maven. Naložiti boste morali naslednje datoteke JAR:

  • Javax JSON Bind API 1.0: Vsebuje vse datoteke razreda JSON-B. Prenesla sem javax.json.bind-api-1.0.jar.
  • Yasson: Vsebuje referenčno izvedbo JSON-B na osnovi Eclipse. Prenesla sem yasson-1.0.3.jar.
  • Privzeti ponudnik JSR 374 (obdelava JSON): Vsebuje vse datoteke razreda JSON-P 1.0 skupaj s privzetimi datotekami razreda ponudnika Glassfish. Prenesla sem javax.json-1.1.4.jar.

Te datoteke JAR dodajte v svojo učilno pot pri prevajanju in zagonu kode, ki uporablja te knjižnice:

javac -cp javax.json.bind-api-1.0.jar ;. glavna izvorna datoteka java -cp javax.json.bind-api-1.0.jar; yasson-1.0.3.jar; javax.json-1.1.4.jar ;. glavna datoteka predavanj

Serializiranje in deserializacija predmetov Java z JSON-B

The javax.json.bind paket vsebuje Jsonb in JsonbBuilder vmesniki, ki služijo kot vstopna točka v to knjižnico:

  • Jsonb zagotavlja preobremenjeno toJson () metode za serializacijo dreves predmetov Java na dokumente JSON in odJson () metode za deserializacijo dokumentov JSON na drevesa predmetov Java.
  • JsonbBuilder prispeva newBuilder () in druge metode za pridobitev novega graditelja in zgraditi () in ustvari () metode za vrnitev novega Jsonb predmetov.

Naslednji primer kode prikazuje osnovno uporabo Jsonb in JsonBuilder vrste:

// Ustvari nov primerek Jsonb z uporabo privzete izvedbe JsonbBuilder. Jsonb jsonb = JsonbBuilder.create (); // Ustvari objekt Employee iz hipotetičnega razreda Employee. Zaposleni zaposleni = ... // Pretvori objekt Employee v dokument JSON, shranjen v nizu. Niz jsonEfficiee = jsonb.toJson (zaposleni); // Pretvorite prej ustvarjeni dokument JSON v objekt Employee. Employee worker2 = jsonb.fromJson (jsonE Employee, Employee.class);

Ta primer se sklicuje Jsonbje String toJson (objektni objekt) metoda za serializacijo predmeta Java, (Zaposleni). Ta metoda se posreduje korenu drevesa predmetov Java za serializacijo. Če nič je opravljeno, toJson () meti java.lang.NullPointerException. Vrže javax.json.bind.JsonbException ko se med serializacijo pojavi nepričakovana težava (na primer napaka V / I).

Kliče se tudi ta fragment kode Jsonbje T fromJson (String str, vrsta razreda) generična metoda, ki se uporablja za deserializacijo. Ta metoda se posreduje dokumentu JSON, ki temelji na nizu, za deserializacijo in vrsto korenskega predmeta nastalega drevesa predmeta Java, ki se vrne. Ta metoda vrže NullPointerException kdaj nič se posreduje enemu ali drugemu parametru; vrže JsonbException ko se med deserializacijo pojavi nepričakovana težava.

Odsek kode sem izvlekel iz JSONBDemo aplikacija, ki nudi osnovni prikaz JSON-B. Seznam 1 predstavlja izvorno kodo za to predstavitev.

Seznam 1. JSONBDemo.java (različica 1)

uvoz java.time.LocalDate; uvoz javax.json.bind.Jsonb; uvoz javax.json.bind.JsonbBuilder; javni razred JSONBDemo {public static void main (String [] args) {Jsonb jsonb = JsonbBuilder.create (); Zaposleni zaposleni = novi zaposleni ("John", "Doe", 123456789, false, LocalDate.of (1980, 12, 23), LocalDate.of (2002, 8, 14)); Niz jsonEfficiee = jsonb.toJson (zaposleni); System.out.println (jsonE Employee); System.out.println (); Employee worker2 = jsonb.fromJson (jsonE Employee, Employee.class); System.out.println (zaposleni2); }}

glavni () najprej ustvari a Jsonb predmet, ki mu sledi znak Zaposleni predmet. Nato pokliče toJson () za serializacijo Zaposleni objekt dokumentu JSON, ki je shranjen v nizu. Po tiskanju tega dokumenta glavni () prikliče odJson () s prejšnjim nizom in Zaposlenije java.lang.Class objekt, da deserializira dokument JSON na drugega Zaposleni predmet, ki se nato natisne.

Seznam 2 predstavlja Zaposleniizvorna koda.

Seznam 2. Employee.java (različica 1)

uvoz java.time.LocalDate; javni razred zaposleni {private String firstName; zasebni niz lastName; zasebni int ssn; private boolean isMarried; zasebni LocalDate datum rojstva; zasebni LocalDate datum najema; private StringBuffer sb = new StringBuffer (); public Employee () {} public Employee (String firstName, String lastName, int ssn, boolean isMarried, LocalDate birthDate, LocalDate hireDate) {this.firstName = firstName; this.lastName = lastName; this.ssn = ssn; this.isMarried = isMarried; this.birthDate = datum rojstva; this.hireDate = datum najema; } javni niz getFirstName () {return firstName; } javni niz getLastName () {return lastName; } javni int getSSN () {return ssn; } public boolean isMarried () {return isMarried; } javni LocalDate getBirthDate () {vrnitev na datum rojstva; } javni LocalDate getHireDate () {vrni najemDate; } javna praznina setFirstName (String firstName) {this.firstName = firstName; } javna praznina setLastName (niz lastName) {this.lastName = lastName; } javna void setSSN (int ssn) {this.ssn = ssn; } javna void setIsMarried (logična isMarried) {this.isMarried = isMarried; } javna praznina setBirthDate (LocalDate birthDate) {this.birthDate = birthDate; } javna void setHireDate (LocalDate najam datuma) {this.hireDate = najem datuma; } @Override javni niz toString () {sb.setLength (0); sb.append ("Ime ["); sb.append (firstName); sb.append ("], Priimek ["); sb.append (lastName); sb.append ("], SSN ["); sb.append (ssn); sb.append ("], poročen ["); sb.append (isMarried); sb.append ("], Datum rojstva ["); sb.append (datum rojstva); sb.append ("], Hiredate ["); sb.append (datum najema); sb.append ("]"); vrni sb.toString (); }}

Sestavi seznam 1 in 2, kot sledi:

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

Zaženite aplikacijo na naslednji način:

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

Upoštevati morate naslednji izhod (razločljivost v več vrstic zaradi berljivosti):

{"SSN": 123456789, "BirthDate": "1980-12-23", "firstName": "John", "rentalDate": "2002-08-14", "lastName": "Doe", "poročen" : false} Ime [John], Priimek [Doe], SSN [123456789], Poročen [false], Datum rojstva [1980-12-23], Hiredate [2002-08-14] 

Pravila za delo z JSON-B

Med igranjem s to aplikacijo sem opazil nekaj zanimivih vedenj, zaradi katerih sem oblikoval naslednja pravila glede Zaposleni:

  • Razred mora biti javnosti; v nasprotnem primeru se vrže izjema.
  • toJson () ne bo serializiral polj zjavnosti getter metode.
  • odJson () ne bo deserializiral polj z ne-javnosti metode postavljanja.
  • odJson () meti JsonbException v odsotnosti a javna argumentacija konstruktor.

Za nemoteno pretvorbo med polji predmeta Java in podatki JSON mora JSON-B podpirati različne vrste Java. Na primer, JSON-B podpira naslednje osnovne tipe Java:

  • java.lang.Boolean
  • java.lang.Byte
  • java.lang.Character
  • java.lang.Dvojnik
  • java.lang.Float
  • java.lang.Integer
  • java.lang.Long
  • java.lang.Short
  • java.lang.String

Dodatne vrste, kot so java.math.BigInteger, java.util.Date, in java.time.LocalDate so podprti. Za popoln seznam podprtih vrst si oglejte specifikacijo JSON-B.

Serializiranje in deserializiranje nizov in zbirk z JSON-B

Prejšnji odsek se je osredotočil na serializacijo in deserializacijo posameznih predmetov Java. JSON-B podpira tudi možnost serializacije in deserializacije nizov in zbirk predmetov. Seznam 3 vsebuje predstavitev.

Seznam 3. JSONBDemo.java (različica 2)

uvoz java.time.LocalDate; uvoz java.util.ArrayList; uvoz java.util.Arrays; uvoz java.util.List; uvoz javax.json.bind.Jsonb; uvoz javax.json.bind.JsonbBuilder; javni razred JSONBDemo {public static void main (String [] args) {arrayDemo (); listDemo (); } // Serializirajte in deserializirajte vrsto predmetov Employee. statična void arrayDemo () {Jsonb jsonb = JsonbBuilder.create (); Zaposleni [] zaposleni = {novi zaposleni ("John", "Doe", 123456789, false, LocalDate.of (1980, 12, 23), LocalDate.of (2002, 8, 14)), novi zaposleni ("Jane" , "Smith", 987654321, true, LocalDate.of (1982, 6, 13), LocalDate.of (2001, 2, 9))}; Niz jsonE Employees = jsonb.toJson (zaposleni); System.out.println (jsonE Employees); System.out.println (); zaposlenih = nič; zaposleni = jsonb.fromJson (jsonE Employees, Employee []. class); za (zaposleni zaposleni: zaposleni) {System.out.println (zaposleni); System.out.println (); }} // Serializirajte in deserializirajte seznam predmetov zaposlenih. static void listDemo () {Jsonb jsonb = JsonbBuilder.create (); Seznam zaposlenih = Arrays.asList (new Employee ("John", "Doe", 123456789, false, LocalDate.of (1980, 12, 23), LocalDate.of (2002, 8, 14)), new Employee ("Jane "," Smith ", 987654321, true, LocalDate.of (1982, 6, 13), LocalDate.of (1999, 7, 20))); String jsonEfficiees = jsonb.toJson (zaposleni); System.out.println (jsonE Employees); System.out.println (); zaposlenih = nič; zaposleni = jsonb.fromJson (jsonE Employees, novi ArrayList () {}. getClass (). getGenericSuperclass ()); System.out.println (zaposleni); }}

Seznam 3 je preprosta razširitev seznama 1 in uporablja istega Zaposleni razred, predstavljen v seznamu 2. Poleg tega ta primer kode kliče enako toJson () in odJson () metode.

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