Introduksjon til JSON-Java (org.json)

1. Introduksjon til JSON-Java

JSON (et akronym for JavaScript Object Notation) er et lett datautvekslingsformat og er mest brukt til klient-server-kommunikasjon. Det er både lett å lese / skrive og språkuavhengig. En JSON-verdi kan være en annen JSON objekt, matrise, nummer, streng, boolsk (true / false) eller null.

I denne opplæringen vil vi se hvordan vi kan lage, manipulere og analysere JSON ved hjelp av et av de tilgjengelige JSON-behandlingsbibliotekene, dvs. JSON-Java-biblioteket er også kjent som org.json.

2. Forhåndsbestill

Før vi begynner, må vi legge til følgende avhengighet i vår pom.xml:

 org.json json 20180130 

Den siste versjonen finner du i Maven Central repository.

Merk at denne pakken allerede er inkludert i Android SDK, så vi bør ikke inkludere den mens vi bruker den samme.

3. JSON i Java [pakke org.json]

JSON-Java-biblioteket er også kjent som org.json (ikke forveksles med Googles org.json.simple) gir oss klasser som brukes til å analysere og manipulere JSON i Java.

Videre kan dette biblioteket også konvertere mellom JSON, XML, HTTP-overskrifter, informasjonskapsler, kommaavgrenset liste eller tekst, etc.

I denne opplæringen vil vi se på:

  1. JSONObjekt - ligner Java sitt innfødte Kart som objekt som lagrer uordnede nøkkelverdipar
  2. JSONArray - en ordnet sekvens av verdier som ligner på Javas opprinnelige Vector-implementering
  3. JSONTokener - et verktøy som deler et stykke tekst i en serie med tokens som kan brukes av JSONObject eller JSONArray for å analysere JSON-strenger
  4. CDL - et verktøy som gir metoder for å konvertere komma-avgrenset tekst til en JSONArray og vice versa
  5. Kjeks - konverterer fra JSON String til informasjonskapsler og omvendt
  6. HTTP - brukes til å konvertere fra JSON String til HTTP-overskrifter og omvendt
  7. JSONE unntak - dette er et standard unntak fra dette biblioteket

4. JSONObject

EN JSONObjekt er en uordnet samling av nøkkel- og verdipar, som ligner Java-innfødte Kart implementeringer.

  • Nøklene er unike Strenger det kan ikke være null
  • Verdier kan være alt fra en Boolsk, Nummer, String, JSONArray eller til og med en JSONObject.NULL gjenstand
  • EN JSONObject kan representeres av en String innesluttet i krøllete bukseseler med nøkler og verdier atskilt med et kolon, og par atskilt med komma
  • Den har flere konstruktører å konstruere en JSONObjekt

Den støtter også følgende hovedmetoder:

  1. få (strengnøkkel) - gkaster objektet som er knyttet til den medfølgende nøkkelen JSONE unntak hvis nøkkelen ikke blir funnet
  2. opt (strengnøkkel) - get objekt som er knyttet til den medfølgende nøkkelen, null ellers
  3. put (strengnøkkel, objektverdi) - setter inn eller erstatter et nøkkelverdipar i gjeldende JSONObjekt.

De sette() metoden er en overbelastet metode som godtar en nøkkel av typen String og flere typer for verdien.

For den komplette listen over metoder som støttes av JSONObject, besøk den offisielle dokumentasjonen.

La oss nå diskutere noen av hovedoperasjonene som støttes av denne klassen.

4.1. Opprette JSON direkte fra JSONObjekt

JSONObject avslører en API som ligner på Java Kart grensesnitt. Vi kan bruke sette() metode og oppgi nøkkel og verdi som argument:

JSONObject jo = nye JSONObject (); jo.put ("navn", "jon doe"); jo.put ("alder", "22"); jo.put ("by", "chicago");

Nå vår JSONObject vil se ut som:

{"city": "chicago", "name": "jon doe", "age": "22"}

Det er syv forskjellige overbelastede signaturer av JSONObject.put () metode. Mens nøkkelen bare kan være unik, ikke-null Streng, verdien kan være hva som helst.

4.2. Opprette JSON fra Map

I stedet for å direkte sette nøkkel og verdier i en JSONObject, kan vi lage en skikk Kart og deretter sende det som et argument til JSONObject’S konstruktør.

Dette eksemplet vil gi de samme resultatene som ovenfor:

Kartkart = nytt HashMap (); map.put ("navn", "jon doe"); map.put ("alder", "22"); map.put ("by", "chicago"); JSONObject jo = nye JSONObject (kart);

4.3. Å skape JSONObjekt fra JSON String

Å analysere en JSON String til en JSONObject, vi kan bare passere String til konstruktøren.

Dette eksemplet vil gi de samme resultatene som ovenfor:

JSONObject jo = new JSONObject ("{\" city \ ": \" chicago \ ", \" name \ ": \" jon doe \ ", \" age \ ": \" 22 \ "}");

Bestått String argumentet må være en gyldig JSON, ellers kan denne konstruktøren kaste et JSONE unntak.

4.4. Serialiser Java-objekt til JSON

En av JSONObjekt 's konstruktører tar en POJO som argument. I eksemplet nedenfor bruker pakken getters fra DemoBean klasse og skaper en passende JSONObject for det samme.

For å få en JSONObjekt fra et Java-objekt, må vi bruke en klasse som er en gyldig Java Bean:

DemoBean demo = ny DemoBean (); demo.setId (1); demo.setName ("lorem ipsum"); demo.setActive (true); JSONObject jo = nye JSONObject (demo);

De JSONObject jo for dette eksemplet kommer til å være:

{"name": "lorem ipsum", "active": true, "id": 1}

Selv om vi har en måte å serieisere et Java-objekt til JSON-streng, er det ingen måte å konvertere det tilbake ved hjelp av dette biblioteket.

Hvis vi vil ha den slags fleksibilitet, kan vi bytte til andre biblioteker som Jackson.

5. JSONArray

EN JSONArray er en ordnet verdisamling som ligner Java Vector gjennomføring.

  • Verdier kan være alt fra en Nummer, String, Boolsk, JSONArray, JSONObjekt eller til og med en JSONObject.NULL gjenstand
  • Det er representert med en String innpakket i firkantede parenteser og består av en samling verdier atskilt med komma
  • Som JSONObject, den har en konstruktør som godtar en kilde String og analyserer den for å konstruere en JSONArray

Følgende er de viktigste metodene for JSONArray klasse:

  1. få (int-indeks) - returner verdien ved den spesifiserte indeksen (mellom 0 og total lengde - 1), ellers kaster a JSONE unntak
  2. opt (int-indeks) - returnerer verdien som er knyttet til en indeks (mellom 0 og total lengde - 1). Hvis det ikke er noen verdi i den indeksen, så a null blir returnert
  3. put (Objektverdi) - legg til en objektverdi til dette JSONArray. Denne metoden er overbelastet og støtter et bredt spekter av datatyper

For en komplett liste over metoder som støttes av JSONArray, besøk den offisielle dokumentasjonen.

5.1. Å skape JSONArray

Når vi har initialisert et JSONArray-objekt, kan vi ganske enkelt legge til og hente elementer ved hjelp av sette() og få() metoder:

JSONArray ja = ny JSONArray (); ja.put (boolsk.TRUE); ja.put ("lorem ipsum"); JSONObject jo = nye JSONObject (); jo.put ("navn", "jon doe"); jo.put ("alder", "22"); jo.put ("by", "chicago"); ja.put (jo);

Følgende vil være innholdet i vårt JSONArray(koden er formatert for klarhet):

[true, "lorem ipsum", {"city": "chicago", "name": "jon doe", "age": "22"}]

5.2. Å skape JSONArray Direkte fra JSON String

Som JSONObjekt de JSONArray har også en konstruktør som lager et Java-objekt direkte fra en JSON String:

JSONArray ja = new JSONArray ("[true, \" lorem ipsum \ ", 215]");

Denne konstruktøren kan kaste en JSONE unntak hvis kilden String er ikke en gyldig JSON String.

5.3. Å skape JSONArray Direkte fra en samling eller en serie

Konstruktøren av JSONArray støtter også samling- og arrayobjekter som argumenter.

Vi sender dem ganske enkelt som et argument til konstruktøren, og det vil returnere a JSONArray gjenstand:

Listeliste = ny ArrayList (); list.add ("California"); list.add ("Texas"); list.add ("Hawaii"); list.add ("Alaska"); JSONArray ja = ny JSONArray (liste);

Nå vår JSONArray inneholder:

["California", "Texas", "Hawaii", "Alaska"]

6. JSONTokener

EN JSONTokener tar en kilde String som input til konstruktøren og trekker ut tegn og tokens fra den. Den brukes internt av klasser i denne pakken (som JSONObject, JSONArray) for å analysere JSON Strenger.

Det kan ikke være mange situasjoner der vi bruker denne klassen direkte, da den samme funksjonaliteten kan oppnås ved hjelp av andre enklere metoder (som f.eks string.toCharArray ()):

JSONTokener jt = ny JSONTokener ("lorem"); mens (jt.more ()) {Log.info (jt.next ()); }

Nå kan vi få tilgang til en JSONTokener som en iterator, ved hjelp av mer() metode for å sjekke om det er gjenværende elementer og neste () for å få tilgang til neste element.

Tokene mottatt fra forrige eksempel vil være:

l o r e m

7. CDL

Vi får en CDL (Komma-avgrenset liste) klasse for å konvertere kommaavgrenset tekst til en JSONArray og vice versa.

7.1. Produserer JSONArray Direkte fra Comma Delimited Text

For å produsere en JSONArray direkte fra den kommaavgrensede teksten, kan vi bruke den statiske metoden rowToJSONArray () som godtar en JSONTokener:

JSONArray ja = CDL.rowToJSONArray (ny JSONTokener ("England, USA, Canada"));

Våre JSONArray består nå av:

["England", "USA", "Canada"]

7.2. Produserer kommaavgrenset tekst fra JSONArray

For å reversere forrige trinn og komme tilbake den kommadelte teksten fra JSONArray, Vi kan bruke:

JSONArray ja = nye JSONArray ("[\" England \ ", \" USA \ ", \" Canada \ "]"); String cdt = CDL.rowToString (ja);

De Stringcdt inneholder nå:

England, USA, Canada

7.3. Produserer JSONArray av JSONObjects Bruke kommaavgrenset tekst

Å produsere en JSONArray av JSONObjekts, vi bruker en tekst String inneholder både overskrifter og data atskilt med komma.

De forskjellige linjene skilles fra hverandre ved hjelp av en vognretur (\ r) eller linjefôr (\ n).

Den første linjen tolkes som en liste med overskrifter, og alle de påfølgende linjene blir behandlet som data:

Strengstreng = "navn, by, alder \ n" + "john, chicago, 22 \ n" + "gary, florida, 35 \ n" + "sal, vegas, 18"; JSONArray-resultat = CDL.toJSONArray (streng);

Objektet JSON Array-resultat består nå av (utdata formatert for klarhets skyld):

[{"name": "john", "city": "chicago", "age": "22"}, {"name": "gary", "city": "florida", "age": "35 "}, {" name ":" sal "," city ":" vegas "," age ":" 18 "}]

Legg merke til at i dette eksemplet ble både data og topptekst levert innenfor det samme String.Det er en alternativ måte å gjøre dette der vi kan oppnå samme funksjonalitet ved å levere en JSONArray som ville blitt brukt til å få overskrifter og komma-avgrenset String fungerer som dataene.

Ulike linjer skilles fra hverandre ved hjelp av vognretur (\ r) eller linjefôr (\ n):

JSONArray ja = ny JSONArray (); ja.put ("navn"); ja.put ("by"); ja.put ("alder"); Strengstreng = "john, chicago, 22 \ n" + "gary, florida, 35 \ n" + "sal, vegas, 18"; JSONArray resultat = CDL.toJSONArray (ja, streng);

Her får vi innholdet av objektet resultat akkurat som før.

8. Cookie

De Kjeks klasse behandler informasjonskapsler i nettleseren og har metoder for å konvertere en nettleserkake til en JSONObject og vice versa.

Her er de viktigste metodene for Kjeks klasse:

  1. toJsonObject (String sourceCookie) - konverterer en informasjonskapselstreng til en JSONObject

  2. toString (JSONObject jo) - dette er omvendt fra forrige metode, konverterer a JSONObject inn i en informasjonskapsel String.

8.1. Konvertering av en informasjonskapsel String inn i en JSONObjekt

Å konvertere en informasjonskapsel String til en JSONObject, bruk vel den statiske metoden Cookie.toJSONObject ():

String cookie = "brukernavn = John Doe; utløper = Tor, 18 des 2013 12:00:00 UTC; sti = /"; JSONObject cookieJO = Cookie.toJSONObject (cookie);

8.2. Konvertering av en JSONObjekt inn i Cookie String

Nå konverterer vi en JSONObjekt inn i informasjonskapsel String. Dette er omvendt av forrige trinn:

String cookie = Cookie.toString (cookieJO);

9. HTTP

De HTTP klasse inneholder statiske metoder som brukes til å konvertere HTTP-overskrifter til JSONObject og vice versa.

Denne klassen har også to hovedmetoder:

  1. toJsonObject (streng kildeHttpHeader) - konverterer a HttpHeader String til JSONObjekt
  2. toString (JSONObject jo) - konverterer den medfølgende JSONObject til String

9.1. Konvertering JSONObjekt til HTTP-topptekst

HTTP.toString () metoden brukes til å konvertere en JSONObjekt til HTTP-overskrift Streng:

JSONObject jo = nye JSONObject (); jo.put ("Metode", "POST"); jo.put ("Request-URI", "//www.example.com/"); jo.put ("HTTP-versjon", "HTTP / 1.1"); Streng httpStr = HTTP.toString (jo);

Her, vår Streng httpStr vil bestå av:

POST "//www.example.com/" HTTP / 1.1

Merk at når du konverterer en HTTP-forespørselstittel, JSONObject må inneholde "Metode",“Forespørsel-URI” og “HTTP-versjon” nøkler, mens objektet må inneholde for svarhode “HTTP-versjon”,“Status-kode” og “Reason-Phrase” parametere.

9.2. Konverterer HTTP-topptekst String Tilbake til JSONObject

Her vil vi konvertere HTTP-strengen som vi fikk i forrige trinn tilbake til selve JSONObject som vi opprettet i det trinnet:

JSONObject obj = HTTP.toJSONObject ("POST \" // www.eksempel.com/ \ "HTTP / 1.1");

10. JSONE unntak

De JSONE unntak er standard unntak fra denne pakken når det oppstår feil.

Dette brukes på tvers av alle klasser fra denne pakken. Unntaket følges vanligvis av en melding som sier hva som gikk galt.

11. Konklusjon

I denne opplæringen så vi på en JSON ved hjelp av Java - org.json - og vi fokuserte på noen av kjernefunksjonalitetene som er tilgjengelige her.

De komplette kodebitene som brukes i denne artikkelen, finner du på GitHub.