Uvod u JSON-Javu (org.json)

1. Uvod u JSON-Javu

JSON (kratica za JavaScript Object Notation) lagan je format za razmjenu podataka i jest najčešće se koristi za komunikaciju klijent-poslužitelj. Jednostavno ga je čitati / pisati i neovisno o jeziku. JSON vrijednost može biti drugi JSON objekt, niz, broj, niz, logička vrijednost (istinito / netačno) ili null.

U ovom uputstvu vidjet ćemo kako možemo stvoriti, manipulirati i raščlaniti JSON koristeći jednu od dostupnih knjižnica obrade JSON, tj. JSON-Java knjižnica je također poznata kao org.json.

2. Preduvjet

Prije nego što započnemo, morat ćemo dodati sljedeću ovisnost u našu pom.xml:

 org.json json 20180130 

Najnoviju verziju možete pronaći u spremištu Maven Central.

Imajte na umu da je ovaj paket već uključen u Android SDK, pa ga ne bismo trebali uključiti dok ga upotrebljavamo.

3. JSON u Javi [paket org.json]

JSON-Java knjižnica također je poznata kao org.json (da se ne miješa s Googleovim org.json.simple) pruža nam klase koje se koriste za raščlanjivanje i manipulaciju JSON-om na Javi.

Nadalje, ova knjižnica također može pretvoriti između JSON-a, XML-a, HTTP zaglavlja, kolačića, popisa s tekstom i s tekstom itd.

U ovom uputstvu ćemo pogledati:

  1. JSONObject - slično izvornom jeziku Java Karta poput objekta koji pohranjuje neuređene parove ključ / vrijednost
  2. JSONArray - uređeni slijed vrijednosti sličan Java izvornoj implementaciji Vector
  3. JSONTokener - alat koji dijeli dio teksta na niz žetoni koje može koristiti JSONObject ili JSONArray za raščlanjivanje JSON nizova
  4. CDL - alat koji pruža metode za pretvaranje teksta razdvojenog zarezom u JSONArray i obrnuto
  5. Kolačić - pretvara iz JSON - a Niz na kolačiće i obrnuto
  6. HTTP - koristi se za pretvorbu iz JSON-a Niz na HTTP zaglavlja i obrnuto
  7. JSONException - ovo je standardni izuzetak koji donosi ova knjižnica

4. JSONObject

A JSONObject je nesređena kolekcija parova ključeva i vrijednosti, nalik na izvorni Java Karta implementacije.

  • Tipke su jedinstvene Žice to ne može biti null
  • Vrijednosti mogu biti sve od a Booleova, Broj, Niz, JSONArray ili čak a JSONObject.NULL objekt
  • A JSONObject može se predstaviti s Niz zatvoren unutar kovrčavih zagrada s ključevima i vrijednostima odvojenim dvotočkom i parovima odvojenim zarezom
  • Ima nekoliko konstruktora pomoću kojih se može konstruirati a JSONObject

Također podržava sljedeće glavne metode:

  1. get (ključ niza) - gpostavlja objekt povezan s isporučenim ključem, baca JSONException ako ključ nije pronađen
  2. opt (String key) - gpostavlja objekt povezan s isporučenim ključem, null inače
  3. put (ključ niza, vrijednost objekta) - umeće ili zamjenjuje par ključ / vrijednost u trenutnom JSONObject.

The staviti() metoda je preopterećena metoda koja prihvaća ključ tipa Niz i više tipova za vrijednost.

Potpuni popis metoda koje podržava JSONObject, posjetite službenu dokumentaciju.

Razmotrimo sada neke od glavnih operacija koje podržava ova klasa.

4.1. Izrada JSON-a izravno iz JSONObject

JSONObject izlaže API sličan Javinom Karta sučelje. Možemo koristiti staviti() metoda i kao argument daju ključ i vrijednost:

JSONObject jo = novi JSONObject (); jo.put ("ime", "jon doe"); jo.put ("dob", "22"); jo.put ("grad", "chicago");

Sada naš JSONObject izgledalo bi kao:

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

Postoji sedam različitih preopterećenih potpisa JSONObject.put () metoda. Iako ključ može biti samo jedinstven, ne-null Niz, vrijednost može biti bilo što.

4.2. Izrada JSON-a iz karte

Umjesto da izravno stavite ključ i vrijednosti u a JSONObject, možemo konstruirati običaj Karta a zatim ga proslijediti kao argument JSONObject'S konstruktor.

Ovaj će primjer dati iste rezultate kao gore:

Karta karte = novi HashMap (); map.put ("ime", "jon doe"); map.put ("dob", "22"); map.put ("grad", "chicago"); JSONObject jo = novi JSONObject (karta);

4.3. Stvaranje JSONObject iz JSON-a Niz

Za raščlanjivanje JSON-a Niz do a JSONObject, možemo samo proći Niz konstruktoru.

Ovaj će primjer dati iste rezultate kao gore:

JSONObject jo = novi JSONObject ("{\" grad \ ": \" chicago \ ", \" ime \ ": \" jon doe \ ", \" dob \ ": \" 22 \ "}"));

Položeno Niz argument mora biti valjani JSON, u suprotnom ovaj konstruktor može baciti a JSONException.

4.4. Serijalizirajte Java objekt u JSON-u

Jedan od JSONObject 's konstruktori uzima POJO kao svoj argument. U donjem primjeru paket koristi getere iz DemoBean razreda i stvara odgovarajuću JSONObject za isto.

Da biste dobili JSONObject iz Java objekta, morat ćemo koristiti klasu koja je valjani Java Bean:

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

The JSONObjekt jo za ovaj će primjer biti:

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

Iako imamo način serializirati Java objekt u JSON niz, ne postoji način da ga pretvorimo natrag pomoću ove knjižnice.

Ako želimo takvu vrstu fleksibilnosti, možemo se prebaciti na druge knjižnice kao što je Jackson.

5. JSONArray

A JSONArray je uređena zbirka vrijednosti nalik izvornoj Javi Vektor provedba.

  • Vrijednosti mogu biti sve od a Broj, Niz, Booleova, JSONArray, JSONObject ili čak a JSONObject.NULL objekt
  • Zastupljen je s Niz umotana u uglate zagrade i sastoji se od zbirke vrijednosti odvojenih zarezima
  • Kao JSONObject, ima konstruktor koji prihvaća izvor Niz i raščlanjuje ga za konstrukciju a JSONArray

Slijede primarne metode JSONArray razred:

  1. get (int indeks) - reurns vrijednost u navedenom indeksu (između 0 i ukupne dužine - 1), u suprotnom baca a JSONException
  2. opt (int indeks) - vraća vrijednost povezanu s indeksom (između 0 i ukupne duljine - 1). Ako u tom indeksu nema vrijednosti, tada a null se vraća
  3. put (vrijednost objekta) - tome dodaj vrijednost objekta JSONArray. Ova je metoda preopterećena i podržava širok raspon tipova podataka

Potpuni popis metoda koje podržava JSONArray potražite u službenoj dokumentaciji.

5.1. Stvaranje JSONArray

Nakon što smo inicijalizirali JSONArray objekt, možemo jednostavno dodavati i dohvatiti elemente pomoću staviti() i dobiti() metode:

JSONArray ja = novi JSONArray (); ja.put (Boolean.TRUE); ja.put ("lorem ipsum"); JSONObject jo = novi JSONObject (); jo.put ("ime", "jon doe"); jo.put ("dob", "22"); jo.put ("grad", "chicago"); ja.put (jo);

Slijedili bi sadržaji našeg JSONArray(kôd je formatiran radi preglednosti):

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

5.2. Stvaranje JSONArray Izravno iz JSON Stringa

Kao JSONObject the JSONArray također ima konstruktor koji kreira Java objekt izravno iz JSON-a Niz:

JSONArray ja = novi JSONArray ("[istina, \" lorem ipsum \ ", 215]");

Ovaj konstruktor može baciti a JSONException ako je izvor Niz nije valjani JSON Niz.

5.3. Stvaranje JSONArray Izravno iz zbirke ili niza

Konstruktor za JSONArray također podržava objekte kolekcije i niza kao argumente.

Jednostavno ih prosljeđujemo kao argument konstruktoru i on će vratiti a JSONArray objekt:

Lista popisa = novi ArrayList (); list.add ("Kalifornija"); list.add ("Teksas"); list.add ("Havaji"); list.add ("Aljaska"); JSONArray ja = novi JSONArray (popis);

Sada naš JSONArray sastoji se od:

["Kalifornija", "Teksas", "Havaji", "Aljaska"]

6. JSONTokener

A JSONTokener uzima izvor Niz kao ulaz u svoj konstruktor i iz njega izvlači znakove i znakove. Interno ga koriste klase ovog paketa (poput JSONObject, JSONArray) za raščlanjivanje JSON-a Žice.

Možda neće biti mnogo situacija u kojima ćemo izravno koristiti ovu klasu jer se ista funkcionalnost može postići i drugim jednostavnijim metodama (poput string.toCharArray ()):

JSONTokener jt = novi JSONTokener ("lorem"); while (jt.more ()) {Log.info (jt.next ()); }

Sada možemo pristupiti a JSONTokener poput iteratora, koristeći više() metoda za provjeru postoje li preostali elementi i Sljedeći() za pristup sljedećem elementu.

Oznake primljene iz prethodnog primjera bit će:

l o r e m

7. CDL

Opskrbljeni smo CDL-om (Popis razdvojen zarezom) klasa za pretvaranje teksta razdvojenog zarezom u JSONArray i obrnuto.

7.1. Proizvodnja JSONArray Izravno iz teksta razgraničenog zarezom

Da bi se dobio a JSONArray izravno iz teksta razdvojenog zarezom, možemo koristiti statičku metodu rowToJSONArray () koja prihvaća a JSONTokener:

JSONArray ja = CDL.rowToJSONArray (novi JSONTokener ("Engleska, SAD, Kanada"));

Naše JSONArray sada se sastoji od:

["Engleska", "SAD", "Kanada"]

7.2. Izrada teksta razdvojenog zarezom iz JSONArray

Da biste preokrenuli prethodni korak i vratili tekst razdvojen zarezom JSONArray, možemo koristiti:

JSONArray ja = novi JSONArray ("[\" Engleska \ ", \" SAD \ ", \" Kanada \ "]"); Niz cdt = CDL.rowToString (ja);

The Nizcdt sada sadrži:

Engleska, SAD, Kanada

7.3. Proizvodnja JSONArray od JSONObjects Kori {tenjem teksta razdvojenog zarezima

Za proizvodnju a JSONArray od JSONObjects, poslužit ćemo se tekstom Niz sadrži zaglavlja i podatke odvojene zarezima.

Različite se crte odvajaju pomoću vraćanja kočije (\ r) ili linijski feed (\ n).

Prvi redak tumači se kao popis zaglavlja, a svi sljedeći retci tretiraju se kao podaci:

Niz niza = "ime, grad, dob \ n" + "john, chicago, 22 \ n" + "gary, florida, 35 \ n" + "sal, vegas, 18"; Rezultat JSONArray = CDL.toJSONArray (niz);

Predmet Rezultat JSONArray sada se sastoji od (izlaz formatiran radi jasnoće):

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

Primijetite da su u ovom primjeru i podaci i zaglavlje isporučeni unutar istog Niz.Postoji alternativni način za to gdje možemo postići istu funkcionalnost isporukom a JSONArray koja bi se koristila za dobivanje zaglavlja i razdvojenih zarezom Niz radeći kao podaci.

Različite se crte odvajaju pomoću vraćanja kočije (\ r) ili linijski feed (\ n):

JSONArray ja = novi JSONArray (); ja.put ("ime"); ja.put ("grad"); ja.put ("dob"); Niz niza = "john, chicago, 22 \ n" + "gary, florida, 35 \ n" + "sal, vegas, 18"; Rezultat JSONArray = CDL.toJSONArray (ja, niz);

Ovdje ćemo dobiti sadržaj predmeta proizlaziti točno kao i prije.

8. Kolačić

The Kolačić klasa bavi se kolačićima web preglednika i ima metode za pretvaranje kolačića preglednika u JSONObject i obrnuto.

Evo glavnih metoda Kolačić razred:

  1. toJsonObject (String sourceCookie) - pretvara niz kolačića u JSONObject

  2. toString (JSONObject jo) - ovo je obrnuto od prethodne metode, pretvara a JSONObject u kolačić Niz.

8.1. Pretvaranje kolačića Niz u a JSONObject

Za pretvaranje kolačića Niz do a JSONObject, dobro koristite statičku metodu Cookie.toJSONObject ():

Nizni kolačić = "korisničko ime = John Doe; istječe = četvrtak, 18. prosinca 2013. 12:00:00 UTC; put = /"; JSONObject cookieJO = Kolačić.toJSONObject (kolačić);

8.2. Pretvaranje a JSONObject u Cookie Niz

Sada ćemo pretvoriti a JSONObject u kolačić Niz. Ovo je obrnuto od prethodnog koraka:

String cookie = Cookie.toString (cookieJO);

9. HTTP

The HTTP klasa sadrži statičke metode koje se koriste za pretvaranje HTTP zaglavlja u JSONObject i obrnuto.

Ova klasa također ima dvije glavne metode:

  1. toJsonObject (String sourceHttpHeader) - pretvara a Niz HttpHeader do JSONObject
  2. toString (JSONObject jo) - pretvara isporučeno JSONObject do Niz

9.1. Pretvaranje JSONObject u HTTP zaglavlje

HTTP.toString () metoda koristi se za pretvaranje a JSONObject u HTTP zaglavlje Niz:

JSONObject jo = novi JSONObject (); jo.put ("Metoda", "POST"); jo.put ("Zahtjev-URI", "//www.example.com/"); jo.put ("HTTP-verzija", "HTTP / 1.1"); Niz httpStr = HTTP.toString (jo);

Evo, naša Niz httpStr sastojat će se od:

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

Imajte na umu da dok pretvara zaglavlje HTTP zahtjeva, JSONObject mora sadržavati "Metoda",“URI zahtjev” i “HTTP verzija” tipke, dok za zaglavlje odgovora objekt mora sadržavati “HTTP verzija”,"Statusni kod" i "Razlog-fraza" parametri.

9.2. Pretvaranje HTTP zaglavlja Niz Natrag na JSONObject

Ovdje ćemo HTTP niz koji smo dobili u prethodnom koraku pretvoriti u sam JSONObject koje smo stvorili u tom koraku:

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

10. JSONException

The JSONException je standardna iznimka koju ovaj paket izbacuje kad god se naiđe na pogrešku.

To se koristi u svim klasama iz ovog paketa. Iznimku obično prati poruka koja navodi što je točno pošlo po zlu.

11. Zaključak

U ovom uputstvu pogledali smo JSON koristeći Javu - org.json - i usredotočili smo se na neke ovdje dostupne osnovne funkcije.

Cjelokupne isječke koda korištene u ovom članku možete pronaći na GitHubu.