Introducere în JSON-Java (org.json)

1. Introducere în JSON-Java

JSON (un acronim pentru JavaScript Object Notation) este un format ușor de schimb de date și este cel mai frecvent utilizat pentru comunicarea client-server. Este ușor de citit / scris și independent de limbă. O valoare JSON poate fi un alt obiect JSON , matrice, număr, șir, boolean (adevărat / fals) sau nul.

În acest tutorial, vom vedea cum putem crea, manipula și analiza JSON folosind una dintre bibliotecile de procesare JSON disponibile, adică biblioteca JSON-Java este cunoscută și sub numele de org.json.

2. Pre-cerință

Înainte de a începe, va trebui să adăugăm următoarea dependență în pom.xml :

 org.json json 20180130 

Cea mai recentă versiune poate fi găsită în depozitul Maven Central.

Rețineți că acest pachet a fost deja inclus în Android SDK, deci nu ar trebui să îl includem în timp ce îl utilizați.

3. JSON în Java [pachetul org.json]

Biblioteca JSON-Java este, de asemenea, cunoscută sub numele de org.json (care nu trebuie confundat cu org.json.simple de la Google) ne oferă clase care sunt folosite pentru a analiza și manipula JSON în Java.

În plus, această bibliotecă poate converti, de asemenea, între JSON, XML, anteturi HTTP, module cookie, listă sau text delimitate prin virgulă etc.

În acest tutorial, vom arunca o privire la:

  1. JSONObject - similar cu harta nativă Javaca obiect care stochează perechi cheie-valoare neordonate
  2. JSONArray - o secvență ordonată de valori asemănătoare cu implementarea nativă Vector Java
  3. JSONTokener - un instrument care rupe o bucată de text într-o serie de jetoane care pot fi utilizate de JSONObject sau JSONArray pentru a analiza șirurile JSON
  4. CDL - un instrument care oferă metode pentru a converti textul delimitat de virgule într-un JSONArray și invers
  5. Cookie - convertește din JSON String în cookie-uri și invers
  6. HTTP - folosit pentru a converti de la șirul JSONla anteturile HTTP și invers
  7. JSONException - aceasta este o excepție standard aruncată de această bibliotecă

4. JSONObject

Un JSONObject este o colecție neordonată de perechi de chei și valori, asemănătoare cu implementările de hărți native Java .

  • Cheile sunt șiruri unice care nu pot fi nule
  • Valorile pot fi orice, de la un obiect Boolean , Number , String , JSONArray sau chiar un obiect JSONObject.NULL
  • Un obiect JSONO poate fi reprezentat printr-un șir închis în paranteze bucate cu chei și valori separate prin două puncte și perechi separate printr-o virgulă
  • Are mai mulți constructori cu care să construiască un JSONObject

De asemenea, acceptă următoarele metode principale:

  1. get (String key) - obține obiectul asociat cu cheia furnizată, aruncă JSONException dacă cheia nu este găsită
  2. opt (Tasta șir) - obține obiectul asociat cu cheia furnizată, nul în caz contrar
  3. put (Cheie șir, valoare obiect) - inserează sau înlocuiește o pereche cheie-valoare în JSONObject curent .

Metoda put () este o metodă supraîncărcată care acceptă o cheie de tip String și mai multe tipuri pentru valoare.

Pentru lista completă a metodelor acceptate de JSONObject , vizitați documentația oficială.

Să discutăm acum câteva dintre principalele operațiuni susținute de această clasă.

4.1. Crearea JSON direct din JSONObject

JSONObject expune un API similar cu interfața Map Java . Putem folosi metoda put () și putem furniza cheia și valoarea ca argument:

JSONObject jo = new JSONObject(); jo.put("name", "jon doe"); jo.put("age", "22"); jo.put("city", "chicago");

Acum, obiectul nostru JSON ar arăta astfel:

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

Există șapte semnături diferite supraîncărcate ale metodei JSONObject.put () . În timp ce cheia nu poate fi decât șir unic, non-nul , valoarea poate fi orice.

4.2. Crearea JSON din hartă

În loc să punem direct cheia și valorile într-un JSONObject , putem construi o hartă personalizată și apoi o putem transmite ca argument către constructorul JSONObject .

Acest exemplu va produce aceleași rezultate ca mai sus:

Map map = new HashMap(); map.put("name", "jon doe"); map.put("age", "22"); map.put("city", "chicago"); JSONObject jo = new JSONObject(map);

4.3. Crearea JSONObject din șirul JSON

Pentru a analiza un șir JSON într-un obiect JSON , putem doar să trecem șirul la constructor.

Acest exemplu va produce aceleași rezultate ca mai sus:

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

Argumentul String transmis trebuie să fie un JSON valid, altfel acest constructor poate arunca o excepție JSON .

4.4. Serializați obiectul Java în JSON

Unul dintre constructorii JSONObject ia ca argument un POJO. În exemplul de mai jos, pachetul folosește getters din clasa DemoBean și creează un JSONObject adecvat pentru același lucru.

Pentru a obține un JSONObject dintr-un obiect Java, va trebui să folosim o clasă care este un Java Bean valid:

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

Jo obiect JSON pentru acest exemplu va fi:

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

Deși avem o modalitate de a serializa un obiect Java în șir JSON, nu există nicio modalitate de a-l converti înapoi folosind această bibliotecă.

Dacă dorim acest tip de flexibilitate, putem trece la alte biblioteci, cum ar fi Jackson.

5. JSONArray

Un JSONArray este o colecție ordonată de valori, asemănătoare implementării native Java a Vectorului .

  • Values can be anything from a Number, String, Boolean, JSONArray, JSONObject or even a JSONObject.NULL object
  • It's represented by a String wrapped within Square Brackets and consists of a collection of values separated by commas
  • Like JSONObject, it has a constructor that accepts a source String and parses it to construct a JSONArray

The following are the primary methods of the JSONArray class:

  1. get(int index) – returns the value at the specified index(between 0 and total length – 1), otherwise throws a JSONException
  2. opt(int index) – returns the value associated with an index (between 0 and total length – 1). If there's no value at that index, then a null is returned
  3. put(Object value) – append an object value to this JSONArray. This method is overloaded and supports a wide range of data types

For a complete list of methods supported by JSONArray, visit the official documentation.

5.1. Creating JSONArray

Once we've initialized a JSONArray object, we can simply add and retrieve elements using the put() and get() methods:

JSONArray ja = new JSONArray(); ja.put(Boolean.TRUE); ja.put("lorem ipsum"); JSONObject jo = new JSONObject(); jo.put("name", "jon doe"); jo.put("age", "22"); jo.put("city", "chicago"); ja.put(jo);

Following would be contents of our JSONArray(code is formatted for clarity):

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

5.2. Creating JSONArray Directly from JSON String

Like JSONObject the JSONArray also has a constructor that creates a Java object directly from a JSON String:

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

This constructor may throw a JSONException if the source String isn't a valid JSON String.

5.3. Creating JSONArray Directly from a Collection or an Array

The constructor of JSONArray also supports collection and array objects as arguments.

We simply pass them as an argument to the constructor and it will return a JSONArray object:

List list = new ArrayList(); list.add("California"); list.add("Texas"); list.add("Hawaii"); list.add("Alaska"); JSONArray ja = new JSONArray(list);

Now our JSONArray consists of:

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

6. JSONTokener

A JSONTokener takes a source String as input to its constructor and extracts characters and tokens from it. It's used internally by classes of this package (like JSONObject, JSONArray) to parse JSON Strings.

There may not be many situations where we'll directly use this class as the same functionality can be achieved using other simpler methods (like string.toCharArray()):

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

Now we can access a JSONTokener like an iterator, using the more() method to check if there are any remaining elements and next() to access the next element.

The tokens received from the previous example will be:

l o r e m

7. CDL

We're provided with a CDL (Comma Delimited List) class to convert comma delimited text into a JSONArray and vice versa.

7.1. Producing JSONArray Directly from Comma Delimited Text

In order to produce a JSONArray directly from the comma-delimited text, we can use the static method rowToJSONArray() which accepts a JSONTokener:

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

Our JSONArray now consists of:

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

7.2. Producing Comma Delimited Text from JSONArray

In order to reverse of the previous step and get back the comma-delimited text from JSONArray, we can use:

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

The Stringcdt now contains:

England,USA,Canada

7.3. Producing JSONArray of JSONObjects Using Comma Delimited Text

To produce a JSONArray of JSONObjects, we'll use a text String containing both headers and data separated by commas.

The different lines are separated using a carriage return (\r) or line feed (\n).

The first line is interpreted as a list of headers and all the subsequent lines are treated as data:

String string = "name, city, age \n" + "john, chicago, 22 \n" + "gary, florida, 35 \n" + "sal, vegas, 18"; JSONArray result = CDL.toJSONArray(string);

The object JSONArray result now consists of (output formatted for the sake of clarity):

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

Notice that in this example, both data and header were supplied within the same String.There's an alternative way of doing this where we can achieve the same functionality by supplying a JSONArray that would be used to get the headers and a comma-delimited String working as the data.

Different lines are separated using a carriage return (\r) or line feed (\n):

JSONArray ja = new JSONArray(); ja.put("name"); ja.put("city"); ja.put("age"); String string = "john, chicago, 22 \n" + "gary, florida, 35 \n" + "sal, vegas, 18"; JSONArray result = CDL.toJSONArray(ja, string);

Here we'll get the contents of object result exactly as before.

8. Cookie

The Cookie class deals with web browser cookies and has methods to convert a browser cookie into a JSONObject and vice versa.

Here are the main methods of the Cookie class:

  1. toJsonObject(String sourceCookie) – converts a cookie string into a JSONObject

  2. toString(JSONObject jo) – this is reverse of the previous method, converts a JSONObject into a cookie String.

8.1. Converting a Cookie String into a JSONObject

To convert a cookie String to a JSONObject, well use the static method Cookie.toJSONObject():

String cookie = "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC; path=/"; JSONObject cookieJO = Cookie.toJSONObject(cookie);

8.2. Converting a JSONObject into Cookie String

Now we'll convert a JSONObject into cookie String. This is reverse of the previous step:

String cookie = Cookie.toString(cookieJO);

9. HTTP

The HTTP class contains static methods that are used to convert HTTP headers to JSONObject and vice versa.

This class also has two main methods:

  1. toJsonObject(String sourceHttpHeader) – converts a HttpHeader String to JSONObject
  2. toString(JSONObject jo) – converts the supplied JSONObject to String

9.1. Converting JSONObject to HTTP Header

HTTP.toString() method is used to convert a JSONObject to HTTP header String:

JSONObject jo = new JSONObject(); jo.put("Method", "POST"); jo.put("Request-URI", "//www.example.com/"); jo.put("HTTP-Version", "HTTP/1.1"); String httpStr = HTTP.toString(jo);

Here, our String httpStr will consist of:

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

Note that while converting an HTTP request header, the JSONObject must contain “Method”,“Request-URI” and “HTTP-Version” keys, whereas, for response header, the object must contain “HTTP-Version”,“Status-Code” and “Reason-Phrase” parameters.

9.2. Converting HTTP Header String Back to JSONObject

Here we will convert the HTTP string that we got in the previous step back to the very JSONObject that we created in that step:

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

10. JSONException

The JSONException is the standard exception thrown by this package whenever any error is encountered.

Acesta este utilizat în toate clasele din acest pachet. Excepția este de obicei urmată de un mesaj care precizează ce anume a greșit.

11. Concluzie

În acest tutorial, am analizat un JSON folosind Java - org.json - și ne-am concentrat pe unele dintre funcționalitățile de bază disponibile aici.

Fragmentele de cod complete utilizate în acest articol pot fi găsite pe GitHub.