Programmering

Java XML og JSON: Dokumentbehandling for Java SE, del 2: JSON-B

I denne artikkelen vil vi fortsette å utforske XML og JSON i Java 11 og utover.

Eksempler i denne artikkelen vil introdusere deg for JSON-B, JSON Binding API for Java. Etter en rask oversikt og installasjonsinstruksjon, vil jeg vise deg hvordan du bruker JSON-B til å serieisere og deserialisere Java-objekter, matriser og samlinger; hvordan du tilpasser serialisering og deserialisering ved hjelp av JSON-B; og hvordan du bruker JSON-B-adaptere til å konvertere kildeobjekter til målobjekter under serialisering eller deserialisering.

Materialet for denne artikkelen er helt nytt, men kan betraktes som et ekstra kapittel (kapittel 13) for den nye boken min, nylig utgitt av Apress: Java XML og JSON, andre utgave.

Om boka: Java XML og JSON

Som jeg delte i forrige artikkel, har Apress nettopp publisert den andre utgaven av boken min, Java XML og JSON. Det har vært en glede å skrive en hel bok om XML og JSON, to teknologier som jeg anser som mer komplementære enn konkurransedyktige. Etter at boka ble utgitt, la jeg til nye eksempler for kapittel 6: Transformering av XML-dokumenter med XSLT, og for kapittel 11: Behandling av JSON med Jackson. Min siste artikkel, "Java XML og JSON: Dokumentbehandling for Java SE, del 1" introduserte en rekke dokumenttransformasjons- og behandlingsteknikker ved bruk av SAXON og Jackson. Husk å sjekke ut den artikkelen for å lære mer om disse teknikkene.

Få koden

Last ned kildekoden for eksempler som brukes i denne opplæringen.

Hva er JSON-B?

JSON-B er et standard bindingslag og API for konvertering av Java-objekter til og fra JSON-dokumenter. Det ligner på Java Architecture for XML Binding (JAXB), som brukes til å konvertere Java-objekter til og fra XML.

JSON-B er bygget på toppen av JSON-P, JSON Processing API som brukes til parsing, generering, spørring og transformering av JSON-dokumenter. JSON-B ble introdusert av Java Specification Request (JSR) 367 mer enn et år etter den endelige utgivelsen av JSR 353, JSR for JSON-P.

JSON-B API

Nettstedet Java API for JSON Binding (JSON-B) introduserer JSON-B og gir tilgang til forskjellige ressurser, inkludert API-dokumentasjon. I følge dokumentasjonen lagrer JSON-B-modulen seks pakker:

  • javax.json.bind: Definerer inngangspunktet for binding av Java-objekter til JSON-dokumenter.
  • javax.json.bind.adapter: Definerer adapterrelaterte klasser.
  • javax.json.bind.annotation: Definerer merknader for å tilpasse kartleggingen mellom Java-programelementer og JSON-dokumenter.
  • javax.json.bind.config: Definerer strategier og policyer for å tilpasse kartleggingen mellom Java-programelementer og JSON-dokumenter.
  • javax.json.bind.serializer: Definerer grensesnitt for å lage egendefinerte serie- og deserialiserere.
  • javax.json.bind.spi: Definerer et tjenesteleverandørgrensesnitt (SPI) for å plugge inn tilpasset JsonbBuilders.

Nettstedet JSON-B gir også en lenke til Yasson, et Java-rammeverk som gir et standard bindingslag mellom Java-klasser og JSON-dokumenter, og en offisiell referanseimplementering av JSON Binding API.

JSON-B og Java EE 8

I likhet med JSON-P ble JSON-B opprinnelig vurdert for inkludering i Java SE, men ble inkludert i Java EE 8-utgivelsen i stedet. Du kan fortsatt jobbe med JSON-B i en Java SE-sammenheng.

Last ned og installer JSON-B

JSON-B 1.0 er den nåværende versjonen i skrivende stund. Du kan få Yasson-referanseimplementeringen av dette biblioteket fra Maven-arkivet. Du må laste ned følgende JAR-filer:

  • Javax JSON Bind API 1.0: Inneholder alle JSON-B-klassefiler. jeg lastet ned javax.json.bind-api-1.0.jar.
  • Yasson: Inneholder den formørkelsesbaserte referanseimplementeringen av JSON-B. jeg lastet ned yasson-1.0.3.jar.
  • JSR 374 (JSON Processing) Standard leverandør: Inneholder alle JSON-P 1.0 klassefiler sammen med Glassfish standardleverandør klassefiler. jeg lastet ned javax.json-1.1.4.jar.

Legg til disse JAR-filene på klassestien din når du kompilerer og kjører kode som bruker disse bibliotekene:

javac -cp javax.json.bind-api-1.0.jar ;. hovedkildefil java -cp javax.json.bind-api-1.0.jar; yasson-1.0.3.jar; javax.json-1.1.4.jar ;. hovedklassfil

Serialisering og deserialisering av Java-objekter med JSON-B

De javax.json.bind pakken gir Jsonb og JsonbBuilder grensesnitt, som fungerer som inngangspunkt for dette biblioteket:

  • Jsonb gir overbelastet toJson () metoder for serialisering av trær av Java-objekter til JSON-dokumenter, og fraJson () metoder for deserialisering av JSON-dokumenter til trær av Java-objekter.
  • JsonbBuilder gir newBuilder () og andre metoder for å skaffe en ny byggmester, og bygge() og skape() metoder for å returnere nye Jsonb gjenstander.

Følgende kodeeksempel viser den grunnleggende bruken av Jsonb og JsonBuilder typer:

// Opprett en ny Jsonb-forekomst ved hjelp av standard JsonbBuilder-implementering. Jsonb jsonb = JsonbBuilder.create (); // Opprett et ansattobjekt fra en hypotetisk ansattklasse. Ansatt ansatt = ... // Konverter ansatt-objektet til et JSON-dokument lagret i en streng. String jsonEmployee = jsonb.toJson (ansatt); // Konverter det tidligere opprettede JSON-dokumentet til et medarbeiderobjekt. Ansatt ansatt2 = jsonb.fromJson (jsonEmployee, Employee.class);

Dette eksemplet påberoper seg Jsonbs String toJson (Objektobjekt) metode for å serieisere et Java-objekt, (Ansatt). Denne metoden sendes roten til Java-objektet for å serieiseres. Hvis null er bestått, toJson () kaster java.lang.NullPointerException. Det kaster javax.json.bind.JsonbException når det oppstår et uventet problem (for eksempel en I / O-feil) under serialisering.

Dette kodefragmentet påkaller også Jsonbs T fromJson (strengstreng, klassetype) generisk metode, som brukes til deserialisering. Denne metoden sendes det strengbaserte JSON-dokumentet for å deserialisere og typen av det resulterende Java-objektets rotobjekt, som returneres. Denne metoden kaster NullPointerException når null overføres til en av parameterne; det kaster Jsonb Unntak når et uventet problem oppstår under deserialisering.

Jeg utdraget kodefragmentet fra a JSONBDemo applikasjon som gir en grunnleggende demonstrasjon av JSON-B. Oppføring 1 presenterer kildekoden for denne demoen.

Oppføring 1. JSONBDemo.java (versjon 1)

importere java.time.LocalDate; importere javax.json.bind.Jsonb; importere javax.json.bind.JsonbBuilder; public class JSONBDemo {public static void main (String [] args) {Jsonb jsonb = JsonbBuilder.create (); Ansatt ansatt = ny ansatt ("John", "Doe", 123456789, false, LocalDate.of (1980, 12, 23), LocalDate.of (2002, 8, 14)); String jsonEmployee = jsonb.toJson (ansatt); System.out.println (jsonEmployee); System.out.println (); Ansatt ansatt2 = jsonb.fromJson (jsonEmployee, Employee.class); System.out.println (ansatt2); }}

hoved() oppretter først en Jsonb gjenstand etterfulgt av et Ansatt gjenstand. Det kaller da toJson () for å serieisere Ansatt motsette seg et JSON-dokument som er lagret i en streng. Etter at du har skrevet ut dette dokumentet, hoved() påkaller fraJson () med forrige streng og Ansatts java.lang.Klasse motsette seg å deserialisere JSON-dokumentet til et annet Ansatt objekt, som deretter skrives ut.

Oppføring 2 gaver Ansattkildekoden.

Oppføring 2. Employee.java (versjon 1)

importere java.time.LocalDate; offentlig klasse Ansatt {privat streng fornavn; privat streng etternavn; privat int ssn; privat boolsk er gift; private LocalDate fødselsdato; private LocalDate hireDate; private StringBuffer sb = nye StringBuffer (); offentlig ansatt () {} offentlig ansatt (streng fornavn, streng etternavn, int ssn, boolsk isMarried, LocalDate birthDate, LocalDate hireDate) {this.firstName = firstName; this.lastName = etternavn; this.ssn = ssn; this.isMarried = isMarried; this.birthDate = fødselsdato; this.hireDate = hireDate; } offentlig streng getFirstName () {return firstName; } offentlig streng getLastName () {return etternavn; } public int getSSN () {return ssn; } public boolean isMarried () {return isMarried; } offentlig LocalDate getBirthDate () {retur fødselsdato; } offentlig LocalDate getHireDate () {retur hireDate; } public void setFirstName (String firstName) {this.firstName = firstName; } offentlig ugyldig setLastName (streng etternavn) {this.lastName = etternavn; } offentlig tomrom 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 ("Fornavn ["); sb.append (fornavn); sb.append ("], Etternavn ["); sb.append (etternavn); sb.append ("], SSN ["); sb.append (ssn); sb.append ("], Gift ["); sb.append (isMarried); sb.append ("], fødselsdato ["); sb.append (fødselsdato); sb.append ("], Hiredate ["); sb.append (hireDate); sb.append ("]"); returner sb.toString (); }}

Sett sammen liste 1 og 2 som følger:

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

Kjør applikasjonen som følger:

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

Du bør følge følgende utdata (spredt over flere linjer for lesbarhet):

{"SSN": 123456789, "birthDate": "1980-12-23", "firstName": "John", "hireDate": "2002-08-14", "lastName": "Doe", "gift" : false} Fornavn [John], Etternavn [Doe], SSN [123456789], Gift [false], Fødselsdato [1980-12-23], Hiredate [2002-08-14] 

Regler for å jobbe med JSON-B

Mens jeg lekte med dette programmet, observerte jeg noen interessante oppførsler som fikk meg til å formulere følgende regler angående Ansatt:

  • Klassen må være offentlig; Ellers kastes et unntak.
  • toJson () vil ikke serialisere felt med ikke-offentlig getter-metoder.
  • fraJson () vil ikke deserialisere felt med ikke-offentlig settermetoder.
  • fraJson () kaster Jsonb Unntak i fravær av en offentlig noargument konstruktør.

For å konvertere sømløst mellom Java-objektfelt og JSON-data, må JSON-B støtte forskjellige Java-typer. For eksempel støtter JSON-B følgende grunnleggende Java-typer:

  • java.lang.Boolean
  • java.lang.Byte
  • java.lang.Character
  • java.lang. dobbelt
  • java.lang.Float
  • java.lang. heltall
  • java.lang. lang
  • java.lang. kort
  • java.lang.Streng

Ytterligere typer som java.math.BigInteger, java.util.Date, og java.time.LocalDate støttes. Sjekk ut JSON-B-spesifikasjonen for en komplett liste over støttede typer.

Serialisering og deserialisering av matriser og samlinger med JSON-B

Den forrige delen fokuserte på serialisering og deserialisering av enkelt Java-objekter. JSON-B støtter også muligheten til å serialisere og deserialisere objektmatriser og samlinger. Listing 3 gir en demonstrasjon.

Oppføring 3. JSONBDemo.java (versjon 2)

importere java.time.LocalDate; importere java.util.ArrayList; importere java.util.Arrays; importere java.util.List; importere javax.json.bind.Jsonb; importere javax.json.bind.JsonbBuilder; public class JSONBDemo {public static void main (String [] args) {arrayDemo (); listDemo (); } // Serialiser og deserialiser en rekke ansatteobjekter. statisk tomrom arrayDemo () {Jsonb jsonb = JsonbBuilder.create (); Ansatt [] ansatte = {ny ansatt ("John", "Doe", 123456789, false, LocalDate.of (1980, 12, 23), LocalDate.of (2002, 8, 14)), ny ansatt ("Jane" , "Smith", 987654321, true, LocalDate.of (1982, 6, 13), LocalDate.of (2001, 2, 9))}; String jsonEmployees = jsonb.toJson (ansatte); System.out.println (jsonMedarbeidere); System.out.println (); ansatte = null; ansatte = jsonb.fromJson (jsonEmployees, Employee []. class); for (Ansatt ansatt: ansatte) {System.out.println (ansatt); System.out.println (); }} // Serialiser og deserialiser en liste over ansatteobjekter. statisk ugyldig listeDemo () {Jsonb jsonb = JsonbBuilder.create (); Liste ansatte = Arrays.asList (ny ansatt ("John", "Doe", 123456789, false, LocalDate.of (1980, 12, 23), LocalDate.of (2002, 8, 14)), ny ansatt ("Jane "," Smith ", 987654321, true, LocalDate.of (1982, 6, 13), LocalDate.of (1999, 7, 20))); String jsonEmployees = jsonb.toJson (ansatte); System.out.println (jsonMedarbeidere); System.out.println (); ansatte = null; ansatte = jsonb.fromJson (jsonEmployees, new ArrayList () {}. getClass (). getGenericSuperclass ()); System.out.println (ansatte); }}

Listing 3 er en enkel utvidelse av Listing 1, og bruker det samme Ansatt klasse presentert i oppføring 2. I tillegg kaller dette kodeeksempelet det samme toJson () og fraJson () metoder.

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