Json-lib: una libreria Java per elaborare dati in formato JSON

Json-lib: una libreria Java per elaborare dati in formato JSON

In questo articolo vedremo come trasformare dei tipi di dati Java (primitivi, array, classi, etc…) in formato JSON (JavaScript Object Notation) e viceversa, utilizzando una libreria in linguaggio Java denominata Json-lib.

A cosa serve questa trasformazione? Ebbene lo sviluppo di applicazioni RIA (Rich Internet Application), attualissimo nel panorama odierno dello sviluppo web oriented, è ormai incentrato sull’utilizzo massivo di JavaScript per la costruzione di interfacce grafiche (GUI) sempre più piacevoli e flessibili e sul paradigma Ajax che permette lo scambio “leggero” (cioè senza ricorrere al refresh del browser) tra Client e Server. Ed è proprio in questa interazione che entra in gioco JSON, il quale è ormai considerato lo standard de facto (a scapito del prolisso XML) per lo scambio di dati tra Client (JavaScript? e Server (che può utilizzare le tecnologie più disparate (Java, PHP, .NET, etc…).

JSON[1] è un formato di testo completamente indipendente dal linguaggio di programmazione, ma utilizza convenzioni conosciute dai programmatori di linguaggi della famiglia del C, come C, C++, C#, Java, JavaScript, Perl, Python, e molti altri. Questa caratteristica fa di JSON un linguaggio ideale per lo scambio di dati.

JSON è basato su due strutture:

  • Un insieme di coppie nome/valore. In diversi linguaggi, questo è realizzato come un oggetto, un record, uno struct, un dizionario, una tabella hash, un elenco di chiavi o un array associativo.
  • Un elenco ordinato di valori. Nella maggior parte dei linguaggi questo si realizza con un array, un vettore, un elenco o una sequenza.

In JSON le due strutture assumono queste forme:

Un oggetto è una serie non ordinata di nomi/valori. Un oggetto inizia con { (parentesi graffa sinistra) e finisce con } (parentesi graffa destra). Ogni nome è seguito da : (due punti) e la coppia di nome/valore sono separati dalla , (virgola).

Un array è una raccolta ordinata di valori. Un array comincia con [ (parentesi quadra sinistra) e finisce con ] (parentesi quadra destra). I valori sono separati dalla , (virgola).

Un valore può essere una stringa tra virgolette, o un numero, o vero o falso o nullo, o un oggetto o un array. Queste strutture possono essere annidate.

Una stringa è una raccolta di zero o più caratteri Unicode, tra virgolette; per le sequenze di escape utilizza la barra rovesciata. Un singolo carattere è rappresentato come una stringa di caratteri di lunghezza uno. Una stringa è molto simile ad una stringa C o Java.

Un numero è molto simile ad un numero C o Java, a parte il fatto che i formati ottali e esadecimali non sono utilizzati.

I caratteri di spaziatura possono essere inseriti in mezzo a qualsiasi coppia di token.

Dopo questa panoramica sul linguaggio JSON, vediamo come poter “tradurre” dei dati in formato Java (Stringhe, array, oggetti, etc…) in formato JSON, e viceversa, utilizzando la libreria Json-lib, che permette di ottenere questa trasformazione automaticamente ed in maniera molto semplice.

Scarichiamo la libreria dal sito: http://sourceforge.net/projects/json-lib/files/json-lib/

Inoltre dobbiamo scaricare le relative librerie da cui dipende, che sono:

  • jakarta commons-lang
  • jakarta commons-beanutils
  • jakarta commons-collections
  • jakarta commons-logging
  • ezmorph
  • xom (opzionale)

Ora possiamo creare un progetto nel nostro IDE Eclipse ed importare queste librerie, creiamo un progetto Web Dinamico così potremo vedere anche quale sarà l’output in una ipotetica JSP che gira su di un Application Server (nel nostro caso Tomcat).

Dalla barra dei menu di Eclipse clicchiamo su File -> New -> Project…, nel wizard per il New Project, selezioniamo Web -> Dynamic Web Project:

Clicchiamo su Next si aprirà questo pannello:

Inseriamo in nome del nostro progetto e lasciamo il resto da Default

Diamo un nome al nostro progetto, scegliamo in Configuration lasciamo Default e clicchiamo su Next fino ad arrivare al tasto Finish (non dobbiamo includere alcuna libreria jar o Runtime particolare).

Includiamo ora nel Build Path le librerie che abbiamo scaricato precedentemente. Per farlo possiamo copiare la libreria direttamente nel folder /WebContent/WEB-INF/lib tramite drag and drop dalla cartella in cui l’abbiamo scaricata, così facendo ritroveremo la libreria sotto Web App Libraries:

Le librerie compariranno sotto il folder Web App Libraries

A questo punto creiamo una classe di Test (TestJson.java) e proviamo il comportamento della libreria:

package it.appuntisoftware;

import java.util.ArrayList;
import java.util.List;
import net.sf.json.JSONArray;

public class TestJson {
public static void main (String args[]){
boolean[] boolArray = new boolean[]{true,false,true};
JSONArray jsonArray = JSONArray.fromObject( boolArray );
System.out.println( jsonArray );
List<String> list = new ArrayList<String>();
list.add( "primo" );
list.add( "secondo" );
jsonArray = JSONArray.fromObject( list );
System.out.println( jsonArray );
}
}

Otterremo questo output a video:

[true,false,true]
["primo","secondo"]

Coerentemente a quanto previsto dallo standard JSON per array di boolean e di tipo stringa.

Proviamo ora a convertire un oggetto di una nostra classe preesistente in formato JSON. Definiamo un oggetto di tipo OggettoGenerico (o qualsiasi nome di fantasia) con delle proprietà che possono essere variabili di tipo booleano, Stringhe o Array:


package it.appuntisoftware;

import net.sf.json.JSONFunction;

public class OggettoGenerico {
private String nome = "aappuntisoftware";
private int id = 1;
private char[] caratteri = new char[]{'a','f'};
private String func = "function(i){ return this.options[i]; }";
private JSONFunction funzione = new JSONFunction(new String[]{"i"},"return this.options[i];");

//Metodi Getter e Setter

}

Nell’esempio abbiamo istanziato un tipo particolare di nome JSONFunction, il quale rappresenta una funzione JavaScript (ovviamente non rappresentabile direttamente in Java ma presente nel linguaggio JSON, in altre parole possiamo trasferire dal Server al Client delle funzioni JavaScript). Oltre ai tipi standard presenti nel linguaggio Java la libreria ci fornisce dunque altri tipi che sono presenti nel linguaggio JSON e sono:

  • JSONFunction
  • JSONArray
  • JSONObject

Per convertire l’oggetto Java in JSON utilizziamo la funzione fromObject() della classe JSONObject in questo modo:

package it.appuntisoftware;

import net.sf.json.JSONObject;

public class TestJson {
public static void main (String args[]){
JSONObject jsonObject = JSONObject.fromObject(new OggettoGenerico() );
System.out.println( jsonObject );
}

}

che produrrà questo output :

{“caratteri”:[“a”,”f”],”func”:function(i){ return this.options[i]; },”funzione”:function(i){ return this.options[i]; },”id”:1,”nome”:”aappuntisoftware”}

dove le coppie sono ordinate alfabeticamente in base al nome della coppia nome/valore (ordine che non ha alcuna ripercussione sulle applicazioni JavaScript che utilizzano l’oggetto, in quanto l’ordine dei dati non conta!).

Vediamo ora come poter utilizzare la libreria all’interno di una JSP:


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%@page import="net.sf.json.JSONObject"%>
<%@page import="it.appuntisoftware.OggettoGenerico" %>
<%
JSONObject jsonObject = JSONObject.fromObject(new OggettoGenerico() );
%>
<%=jsonObject%>
</body>
</html>

Otterremo lo stesso output dell’esempio precedente ma in esecuzione su un Application Server (vedremo in un prossimo articolo come utilizzare questi dati).

Riferimenti

[1] Tratto dal sito web di riferimento dello standard: http://json.org

1 Stella2 Stelle3 Stelle4 Stelle5 Stelle (1 voti, media: 5,00 di 5)
Loading...
You can leave a response, or trackback from your own site.

Leave a Reply

*