Prelucrare JSON (JavaScript Object Notation)

Unele servicii web folosesc formatul JSON pentru transferul de date întrucât, spre diferență de XML care implică numeroase informații suplimentare, acesta optimizează cantitatea de date implicate. De asemenea, este foarte ușor pentru un utilizator uman să prelucreze informațiile reprezentate într-un astfel de format.

Acest mecanism de reprezentare a datelor a fost utilizat inițial în JavaScript, unde acesta descria literali sau obiecte anonime, folosite o singură dată (fără posibilitatea de a fi reutilizate), informațiile fiind transmise prin intermediul unor șiruri de caractere. Ulterior, a fost preliat pe scară largă.

În principiu, informațiile reprezentate în format JSON au structura unei colecții de perechi de tip (cheie, valoare), fiecare dintre acestea fiind grupate într-o listă de obiecte ordonate. Nu se folosesc denumiri de etichete, utilizându-se doar caracterele ", ,, {, }, [ și ].

[
  {
    "attribute1": "valuem1",
    "attribute2": "valuem2",
    ...,
    "attributen": "valuemn"
  }  
]

În Android, prelucrarea documentelor reprezentate în format JSON este realizată prin intermediul clasei JSONObject.

Pentru a intelege mai bine, vom studia utilizarea API-ului in practica prin parsarea raspunsului JSON intors de catre o aplicatie de cutremure, Geonames Earthquakes.

Detaliile care se doresc a fi vizualizate pentru fiecare cutremur în parte sunt:

  • așezarea geografică (latitudinea și longitudinea);
  • magnitudinea;
  • adâncimea la care a avut loc;
  • sursa informației;
  • data și ora la care s-a înregistrat.

Rezultatele sunt furnizate în următorul format:

{
  "earthquakes":[
                  {
                    "eqid":"c0001xgp",
                    "magnitude":8.8,
                    "lng":142.369,
                    "src":"us",
                    "datetime":"2011-03-11 04:46:23",
                    "depth":24.4,
                    "lat":38.322
                  },
                  {
                    "eqid":"c000905e",
                    "magnitude":8.6,
                    "lng":93.0632,
                    "src":"us",
                    "datetime":"2012-04-11 06:38:37",
                    "depth":22.9,
                    "lat":2.311
                  },
                  ...
                ]
}

Astfel, informațiile care trebuie preluate din rezultat sunt:

atribut JSONtip de datedetaliu
latdoublelatitudine
lngdoublelongitudine
magnitudedoublemagnitudinea
depthdoubleadâncimea
srcStringsursa informației
datetimeStringdata și ora la care s-au înregistrat datele

Dupa ce realizam un HTTP GET pentru a primi in format JSON datele, vom parsa astfel:

final ArrayList<EarthquakeInformation> earthquakeInformationList = new ArrayList<EarthquakeInformation>();
JSONObject result = new JSONObject(content);
JSONArray jsonArray = result.getJSONArray(Constants.EARTHQUAKES);
for (int k = 0; k < jsonArray.length(); k++) {
    JSONObject jsonObject = jsonArray.getJSONObject(k);
    earthquakeInformationList.add(new EarthquakeInformation(
    jsonObject.getDouble(Constants.LATITUDE),
    jsonObject.getDouble(Constants.LONGITUDE),
    jsonObject.getDouble(Constants.MAGNITUDE),
    jsonObject.getDouble(Constants.DEPTH),
    jsonObject.getString(Constants.SOURCE),
    jsonObject.getString(Constants.DATETIME)
    ));
}