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 tilpassetJsonbBuilder
s.
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 overbelastettoJson ()
metoder for serialisering av trær av Java-objekter til JSON-dokumenter, ogfraJson ()
metoder for deserialisering av JSON-dokumenter til trær av Java-objekter.JsonbBuilder
girnewBuilder ()
og andre metoder for å skaffe en ny byggmester, ogbygge()
ogskape()
metoder for å returnere nyeJsonb
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 Jsonb
s 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å Jsonb
s 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 Ansatt
s java.lang.Klasse
motsette seg å deserialisere JSON-dokumentet til et annet Ansatt
objekt, som deretter skrives ut.
Oppføring 2 gaver Ansatt
kildekoden.
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 ()
kasterJsonb Unntak
i fravær av enoffentlig 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.