Java JSON Parser

(esempio: parsare i risultati delle Custom Search Google APIs)

JSON (JavaScript Object Notation) è un formato di scambio di dati piuttosto leggero (meno voluminoso di XML): è facilmente leggibile e scrivibile per le persone (oltre che per le macchine) ed è basato su un subset di JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999. JSON è caratterizzato da una doppia struttura:

  • Una collezione di coppie nome/valore
  • Una lista ordinata di valori (in genere implementata come array)

In particolare, in un documento JSON:

  • un "oggetto" è un insieme non ordinato di coppie nome/valore
  • ogni oggetto inizia con una graffa { (left brace) e finisce con } (right brace)
  • coppie nome/valore sono separate dalla virgola , (comma)
  • ogni nome della coppia è seguito dai due punti : (colon)
  • un valore può essere una stringa semplice racchiusa tra doppi apici ", oppure un oggetto racchiuso tra parentesi graffe, oppure un array racchiuso tra parentesi quadre
  • se un valore è un array, questo può essere un array di stringhe o di oggetti. In ogni modo, i suoi elementi sono separati da virgola

Per il parsing di documenti JSON in JAVA si può usare la libreria json.org, il cui jar può essere scaricato da qui. L'oggetto di base è org.json.JSONObject, il cui costruttore ammette come parametro anche una stringa contenente il documento JSON. Una volta ottenuto un riferimento al JSONObject è possibile navigare il documento utilizzando i suoi metodi:
optString("nome_della_coppia")
e optJSONObject("nome_della_coppia").

Come esempio di documento JSON, vediamo l'output di una chiamata alle Custom Search Google API:

				
{
 "kind": "customsearch#search",
 "searchInformation": {
  "searchTime": 0.15376,
  "formattedSearchTime": "0.15",
  "totalResults": "795",
  "formattedTotalResults": "795"
 },
 "items": [
  {
   "kind": "customsearch#result",
   "title": "Effect of Some Extrusion Variables on Rheological Properties",
   "link": "http://www.scielo.br/scielo.php?...",
   "displayLink": "www.scielo.br",
   "snippet": "An increase in feed rate decreased WAI and WSI, but...",
   "formattedUrl": "www.scielo.br/scielo.php?pid=S0104...",
   "pagemap": {
    "metatags": [
     {
      "citation_journal_title": "Brazilian Journal of Chemical Engineering",
      "citation_publisher": "Associação Brasileira de Engenharia Química",
      "citation_title": "Effect of Some Extrusion Variables on...",
      "citation_date": "12/1998",
      "citation_volume": "15",
      "citation_issue": "4",
      "citation_issn": "0104-6632",
      "citation_doi": "10.1590/S0104-66321998000400006",
      ""citation_pdf_url": 
      "http://www.scielo.br/scielo.php?script=sci_pdf...",
      "citation_author": "Chang, Y.K.",
      "citation_author_institution": "Universidade Estadual de Campinas",
      "citation_firstpage": "370",
      "citation_lastpage": "381",
      "citation_id": "10.1590/S0104-66321998000400006"
     }
    ]
   }
  },
  {
   ...
   }
  }
 ]
}}			
			

Il codice Java per estrarre alcune informazioni dal documento può essere:

				
GETHttpRequest req = new GETHttpRequest();
Map<String, String> header_map = new HashMap<String, String>();
String jsonStr = req.dereferenceURI(query, header_map);
JSONObject obj = new JSONObject(jsonStr);
if(obj!=null){
	JSONArray items = obj.optJSONArray("items");
	if(items!=null){
		for(int i=0; i<items.length(); i++){
			JSONObject current = items.optJSONObject(i);
			GoogleObject tmp = new GoogleObject();
			tmp.setTitle(current.optString("title"));
			tmp.setSnippet(current.optString("htmlSnippet"));
			tmp.setPage(current.optString("link"));	
			this.googleobjs.add(tmp);
		}
	}
}