Programavimas

„Java XML“ ir „JSON“: „Java SE“ dokumentų apdorojimas, 2 dalis: JSON-B

Šiame straipsnyje mes tęsime XML ir JSON tyrimus „Java 11“ ir naujesnėse versijose.

Šio straipsnio pavyzdžiai supažindins jus su „JSON-B“, „JSON Binding API for Java“. Po greito apžvalgos ir diegimo instrukcijų aš jums parodysiu, kaip naudoti JSON-B, norint nuoseklinti ir deserializuoti „Java“ objektus, masyvus ir kolekcijas; kaip pritaikyti serializavimą ir deserializavimą naudojant JSON-B; ir kaip naudoti JSON-B adapterius šaltinio objektams konvertuoti į tikslinius objektus serializavimo ar deserializavimo metu.

Šio straipsnio medžiaga yra visiškai nauja, tačiau ją galima laikyti papildomu skyriumi (13 skyrius) naujai mano knygai, kurią neseniai išleido leidykla „Apress“: „Java XML“ ir „JSON“, antrasis leidimas.

Apie knygą: „Java XML“ ir „JSON“

Kaip dalijausi savo ankstesniame straipsnyje, Apress ką tik išleido antrąjį mano knygos leidimą „Java XML“ ir „JSON“. Buvo malonu parašyti visą knygą apie XML ir JSON - dvi technologijas, kurios, manau, labiau papildo, o ne konkuruoja. Po to, kai knyga buvo išleista, pridėjau naujų pavyzdžių 6 skyriui: XML dokumentų transformavimas naudojant XSLT ir 11 skyriui: JSON apdorojimas kartu su Jacksonu. Mano paskutinis straipsnis „Java XML ir JSON:„ Java SE “dokumentų apdorojimas, 1 dalis“ pristatė įvairias dokumentų transformavimo ir apdorojimo technikas, naudojant SAXON ir Jackson. Būtinai peržiūrėkite tą straipsnį, kad sužinotumėte daugiau apie šias technikas.

Gaukite kodą

Atsisiųskite šaltinio kodą pavyzdžių, naudojamų šioje pamokoje.

Kas yra JSON-B?

JSON-B yra standartinis įrišimo sluoksnis ir API, skirtas „Java“ objektams konvertuoti į JSON dokumentus ir iš jų. Tai panašu į „Java Architecture for XML Binding“ (JAXB), kuri naudojama „Java“ objektams konvertuoti į XML ir iš jo.

JSON-B yra sukurtas ant JSON-P, JSON Processing API, naudojamo JSON dokumentams analizuoti, generuoti, pateikti užklausas ir transformuoti. „JSON-B“ buvo įdiegta „Java Specification Request“ (JSR) 367 praėjus daugiau nei metams po galutinio „JSR 353“, JSR JSON-P, išleidimo.

JSON-B API

„Java API for JSON Binding“ (JSON-B) svetainėje pristatoma „JSON-B“ ir suteikiama prieiga prie įvairių išteklių, įskaitant API dokumentaciją. Remiantis dokumentais, JSON-B modulis talpina šešis paketus:

  • javax.json.bind: Nurodo įvesties tašką, susiejantį „Java“ objektus su JSON dokumentais.
  • javax.json.bind.adapter: Apibrėžia su adapteriu susijusias klases.
  • javax.json.bind.annotation: Apibrėžia anotacijas, skirtas tinkinti „Java“ programos elementų ir JSON dokumentų susiejimą.
  • javax.json.bind.config: Apibrėžia strategijas ir strategijas, skirtas tinkinti „Java“ programos elementų ir JSON dokumentų susiejimą.
  • javax.json.bind.serializer: Apibrėžia sąsajas kuriant pasirinktinius serijinius ir deserializatorius.
  • javax.json.bind.spi: Nustato paslaugų teikėjo sąsają (SPI), skirtą prijungti pasirinktinį JsonbBuilders.

JSON-B svetainėje taip pat pateikiama nuoroda į „Yasson“, „Java“ sistemą, kuri suteikia standartinį susiejimo sluoksnį tarp „Java“ klasių ir JSON dokumentų, ir oficialų nuorodos „JSON Binding API“ diegimą.

JSON-B ir „Java EE 8“

Kaip ir JSON-P, taip ir JSON-B iš pradžių buvo svarstoma įtraukti į „Java SE“, tačiau vietoj jo buvo įtraukta į „Java EE 8“ leidimą. Tačiau vis tiek galite dirbti su „JSON-B“ „Java SE“ kontekste.

Atsisiųskite ir įdiekite JSON-B

JSON-B 1.0 yra dabartinė versija rašymo metu. Šios bibliotekos „Yasson“ informacinį diegimą galite gauti iš „Maven“ saugyklos. Turėsite atsisiųsti šiuos JAR failus:

  • „Javax JSON Bind API 1.0“: Jame yra visos JSON-B klasės bylos. Parsisiunčiau javax.json.bind-api-1.0.jar.
  • Yasson: JSON-B yra „Eclipse“ pagrindu sukurtas informacinis diegimas. Parsisiunčiau yasson-1.0.3.jar.
  • „JSR 374“ („JSON“ apdorojimas) numatytasis teikėjas: yra visos „JSON-P 1.0“ klasės failai kartu su numatytųjų „Glassfish“ teikėjų klasių failais. Parsisiunčiau javax.json-1.1.4.jar.

Sudarydami ir vykdydami kodą, kuriame naudojamos šios bibliotekos, pridėkite šiuos JAR failus prie savo klasės kelio:

javac -cp javax.json.bind-api-1.0.jar ;. pagrindinis šaltinio failas java -cp javax.json.bind-api-1.0.jar; yasson-1.0.3.jar; javax.json-1.1.4.jar ;. pagrindinė klasės byla

„Java“ objektų serizavimas ir deserializavimas naudojant JSON-B

javax.json.bind paketas suteikia Jsonb ir JsonbBuilder sąsajos, kurios yra šios bibliotekos įvesties taškas:

  • Jsonb teikia perkrautas toJson () - metodai, kaip serijizuoti Java objektų medžius į JSON dokumentus, ir nuo Json () JSON dokumentų deserializavimo į Java objektų medžius metodai.
  • JsonbBuilder numato newBuilder () ir kiti naujo statybininko gavimo būdai, ir statyti () ir sukurti () metodai, kaip grąžinti naujus Jsonb objektai.

Šis kodo pavyzdys parodo pagrindinį Jsonb ir „JsonBuilder“ tipai:

// Sukurkite naują „Jsonb“ egzempliorių naudodami numatytąjį „JsonbBuilder“ diegimą. Jsonb jsonb = JsonbBuilder.create (); // Sukurkite darbuotojo objektą iš hipotetinės darbuotojų klasės. Darbuotojo darbuotojas = ... // Konvertuokite objektą Darbuotojas į JSON dokumentą, saugomą eilutėje. Stygos jsonEmployee = jsonb.toJson (darbuotojas); // Konvertuokite anksčiau sukurtą JSON dokumentą į darbuotojo objektą. Darbuotojo darbuotojas2 = jsonb.fromJson (jsonDarbuotojas, Darbuotojas.klasė);

Šis pavyzdys remiasi Jsonb's Stygos toJson (objekto objektas) „Java“ objekto serializavimo metodas, (Darbuotojas). Šis metodas yra perduodamas „Java“ objektų medžio šaknyje, kad būtų galima serializuoti. Jei niekinis yra išlaikytas, toJson () metimai java.lang.NullPointerException. Tai meta javax.json.bind.JsonbException kai serializavimo metu atsiranda netikėta problema (pvz., įvesties / išvesties klaida).

Šis kodo fragmentas taip pat remiasi Jsonb's T fromJson (styginių str, klasės tipas) bendrasis metodas, naudojamas deserializacijai. Šis metodas perduodamas eilute pagrįstą JSON dokumentą deserializuoti ir gauto „Java“ objekto medžio šakninio objekto tipą, kuris yra grąžinamas. Šis metimas meta „NullPointerException“ kada niekinis yra perduodamas bet kuriam parametrui; tai meta JsonbIšimtis kai deserializacijos metu iškyla netikėta problema.

Ištraukiau kodo fragmentą iš a JSONBDemo programa, kuri pateikia pagrindinę JSON-B demonstraciją. 1 sąraše pateikiamas šios demonstracinės versijos šaltinio kodas.

1 sąrašas. JSONBDemo.java (1 versija)

importuoti java.time.LocalDate; importuoti javax.json.bind.Jsonb; importuoti javax.json.bind.JsonbBuilder; public class JSONBDemo {public static void main (String [] args) {Jsonb jsonb = JsonbBuilder.create (); Darbuotojo darbuotojas = naujas darbuotojas ("John", "Doe", 123456789, false, LocalDate.of (1980, 12, 23), LocalDate.of (2002, 8, 14)); Stygos jsonEmployee = jsonb.toJson (darbuotojas); System.out.println („jsonEmployee“); System.out.println (); Darbuotojo darbuotojas2 = jsonb.fromJson (jsonDarbuotojas, Darbuotojas.klasė); System.out.println (darbuotojas2); }}

pagrindinis () pirmiausia sukuria a Jsonb objektas, po kurio yra Darbuotojas objektas. Tada paskambina toJson () serializuoti Darbuotojas objektas JSON dokumentui, kuris saugomas eilutėje. Atspausdinę šį dokumentą, pagrindinis () iškviečia nuo Json () su ankstesne eilute ir Darbuotojas's java.lang.Klasė prieštarauti, kad JSON dokumentas būtų deserializuotas kitam Darbuotojas objektas, kuris vėliau atspausdinamas.

Išvardinus 2 dovanas Darbuotojasšaltinio kodas.

Sąrašas 2. Employee.java (1 versija)

importuoti java.time.LocalDate; viešoji klasė Darbuotojas {private String firstName; privati ​​eilutės pavardė; privatus int ssn; privatus loginis yra vedęs; privatus LocalDate birthDate; privatus LocalDate hireDate; privatus „StringBuffer“ sb = naujas „StringBuffer“ (); public Employee () {} public Employee (String firstName, String lastName, int ssn, boolean isMarried, LocalDate birthDate, LocalDate hireDate) {this.firstName = firstName; tai.pavardė = pavardė; tai.ssn = ssn; this.isVedęs = yra Vedęs; tai.gimimo data = gimimo data; this.hireDate = nuomaData; } viešoji eilutė getFirstName () {return firstName; } viešoji eilutė getLastName () {return lastName; } public int getSSN () {return ssn; } viešasis loginis yra vedęs () {return isVedęs; } public LocalDate getBirthDate () {return birthDate; } public LocalDate getHireDate () {return hireDate; } public void setFirstName (String firstName) {this.firstName = firstName; } public void setLastName (eilutės pavardė) {this.lastName = pavardė; } public void setSSN (int ssn) {tai.ssn = ssn; } public void setIsMarried (boolean isMarried) {this.isMarried = isMarried; } public void setBirthDate (LocalDate birthDate) {this.birthDate = gimimo data; } public void setHireDate (LocalDate hireDate) {this.hireDate = nuomaData; } @Paisyti viešą eilutę toString () {sb.setLength (0); sb.append ("Vardas ["); sb.append (firstName); sb.append ("], pavardė ["); sb.append (pavardė); sb.append ("], SSN ["); sb.append (ssn); sb.append ("], Vedęs ["); sb.append (yra Vedęs); sb.append ("], Gimimo data ["); sb.append (birthDate); sb.append ("], Hiredate ["); sb.append (hireDate); sb.append ("]"); grąžinti sb.toString (); }}

Sudarykite 1 ir 2 sąrašus taip:

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

Paleiskite programą taip:

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

Turėtumėte stebėti šią išvestį (išskaidyti keliose eilutėse, kad būtų lengviau skaityti):

{"SSN": 123456789, "birthDate": "1980-12-23", "firstName": "John", "hireDate": "2002-08-14", "lastName": "Doe", "vedęs" : false} Vardas [Jonas], Pavardė [Doe], SSN [123456789], Vedęs [netikras], Gimimo data [1980-12-23], Hiredate [2002-08-14] 

Darbo su JSON-B taisyklės

Žaisdamas su šia programa pastebėjau įdomų elgesį, kuris paskatino mane suformuluoti šias taisykles Darbuotojas:

  • Klasė turi būti visuomenės; priešingu atveju išmetama išimtis.
  • toJson () neserijuos laukų su nevisuomenės geresni metodai.
  • nuo Json () nedererizuos laukų su nevisuomenės seterių metodai.
  • nuo Json () metimai JsonbIšimtis nesant a viešasis noargumentas konstruktorius.

Kad sklandžiai konvertuotų „Java“ objektų laukus ir JSON duomenis, JSON-B turi palaikyti įvairius „Java“ tipus. Pvz., JSON-B palaiko šiuos pagrindinius „Java“ tipus:

  • java.lang.Boolean
  • java.lang.Byte
  • java.lang. Charakteris
  • java.lang.Dvigubai
  • java.lang.Plaukis
  • java.lang.Integer
  • java.lang.Long
  • java.lang.trumpa
  • java.lang.Stringas

Papildomos rūšys, tokios kaip java.math.BigInteger, java.util.Datair java.time.LocalDate yra palaikomi. Išsamų palaikomų tipų sąrašą rasite JSON-B specifikacijose.

Masyvų ir kolekcijų serizavimas ir deserializavimas naudojant JSON-B

Ankstesniame skyriuje pagrindinis dėmesys buvo skiriamas atskirų „Java“ objektų serizavimui ir deserializavimui. JSON-B taip pat palaiko galimybę serializuoti ir deserializuoti objektų masyvus ir kolekcijas. 3 sąrašas pateikia demonstraciją.

3 sąrašas. JSONBDemo.java (2 versija)

importuoti java.time.LocalDate; importuoti java.util.ArrayList; importuoti java.util.Arrays; importuoti java.util.List; importuoti javax.json.bind.Jsonb; importuoti javax.json.bind.JsonbBuilder; public class JSONBDemo {public static void main (String [] args) {arrayDemo (); sąrašasDemo (); } // Serializuokite ir deserializuokite Darbuotojų objektų masyvą. static void arrayDemo () {Jsonb jsonb = JsonbBuilder.create (); Darbuotojo [] darbuotojai = {naujas darbuotojas ("John", "Doe", 123456789, false, LocalDate.of (1980, 12, 23), LocalDate.of (2002, 8, 14)), naujas darbuotojas ("Jane" , "Smith", 987654321, tiesa, LocalDate.of (1982, 6, 13), LocalDate.of (2001, 2, 9))}; Styginiai jsonDarbuotojai = jsonb.toJson (darbuotojai); System.out.println („jsonEmployees“); System.out.println (); darbuotojai = nulis; darbuotojai = jsonb.fromJson (jsonDarbuotojai, Darbuotojas []. klasė); už (Darbuotojo darbuotojas: darbuotojai) {System.out.println (darbuotojas); System.out.println (); }} // Darbuotojų objektų sąrašo serizavimas ir deserializavimas. static void listDemo () {Jsonb jsonb = JsonbBuilder.create (); Darbuotojų sąrašas = Arrays.asList (naujas darbuotojas („John“, „Doe“, 123456789, false, LocalDate.of (1980, 12, 23), LocalDate.of (2002, 8, 14)), naujas darbuotojas („Jane“ "," Smith ", 987654321, tiesa, LocalDate.of (1982, 6, 13), LocalDate.of (1999, 7, 20)); Styginiai jsonDarbuotojai = jsonb.toJson (darbuotojai); System.out.println („jsonEmployees“); System.out.println (); darbuotojai = nulis; darbuotojai = jsonb.fromJson (jsonEmployees, new ArrayList () {}. getClass (). getGenericSuperclass ()); System.out.println (darbuotojai); }}

3 sąrašas yra paprastas 1 sąrašo pratęsimas ir naudoja tą patį Darbuotojas klasė pateikta 2 sąraše. Be to, šis kodo pavyzdys vadina tą patį toJson () ir nuo Json () metodai.

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