In questo articolo vedremo come trattare facilmente il formato JSON in Java, attraverso la libreria Gson.
Per chi non lo sapesse (tratto da Wikipedia) ecco che cos’è Json:
JSON, acronimo di JavaScript Object Notation, è un formato adatto all’interscambio di dati fra applicazioni client-server.[1]
È basato sul linguaggio JavaScript Standard ECMA-262 3ª edizione dicembre 1999, ma ne è indipendente. Viene usato in AJAX come alternativa aXML/XSLT.[2]
I tipi di dati supportati da questo formato sono:
- booleani (
true
efalse
); - interi, reali, virgola mobile;
- stringhe racchiuse da doppi apici (
"
); - array (sequenze ordinate di valori, separati da virgole e racchiusi in parentesi quadre
[]
); - array associativi (sequenze coppie chiave-valore separate da virgole racchiuse in parentesi graffe);
null
.
Uno dei motivi principali per cui JSON ha avuto successo negli ultimi anno è perché permette di trasferire tra diversi dispositivi, che hanno in esecuzione programmi scritti in diversi linguaggi di programmazione, oggetti/informazioni/dati.
Grazie all’utilizzo del formato JSON è possibile convertire una variabile string, del testo, in un “oggetto” in Java.
Ecco un esempio di un file JSON, che descrive una persona:
{ "nome": "Mario", "cognome": "Rossi", "nascita": { "giorno": 1, "mese": 1, "anno": 1980 } }
Come potete vedere, è davvero facile leggere un file JSON, in quanto la sintassi usata è davvero minimale.
Ora vedremo qualche esempio su come usare la libreria Gson per poter convertire un oggetto in un variabile string JSON e il viceversa, ovvero come convertire una string JSON in un oggetto Java.
Per facilità di comprensione, useremo un oggetto davvero semplice, una Persona che ha come attributi il nome, cognome e la data di nascita.
Ecco la classe Persona.java:
package model; public class Persona { private String nome; private String cognome; private Data nascita; public Persona(String nome, String cognome, Data nascita) { super(); this.nome = nome; this.cognome = cognome; this.nascita = nascita; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getCognome() { return cognome; } public void setCognome(String cognome) { this.cognome = cognome; } public Data getNascita() { return nascita; } public void setNascita(Data nascita) { this.nascita = nascita; } @Override public String toString() { return "Persona [nome=" + nome + ", cognome=" + cognome + ", nascita=" + nascita + "]"; } }
Ecco la classe Data.java:
package model; public class Data { private int giorno; private int mese; private int anno; public Data(int giorno, int mese, int anno) { super(); this.giorno = giorno; this.mese = mese; this.anno = anno; } public int getGiorno() { return giorno; } public void setGiorno(int giorno) { this.giorno = giorno; } public int getMese() { return mese; } public void setMese(int mese) { this.mese = mese; } public int getAnno() { return anno; } public void setAnno(int anno) { this.anno = anno; } @Override public String toString() { return "Data [giorno=" + giorno + ", mese=" + mese + ", anno=" + anno + "]"; } }
Ecco il primo test che permette di trasformare un oggetto di tipo Persona in una variabile string e l’operazione inversa:
package tests; import com.google.gson.Gson; import model.Data; import model.Persona; public class ObjectToJSON { public static void main(String[] args) { Persona persona = new Persona("Mario", "Rossi", new Data(1, 1, 1980)); Gson gson = new Gson(); String jsonString = gson.toJson(persona); System.out.println(jsonString); Persona object = gson.fromJson(jsonString, Persona.class); System.out.println(object); } }
Ed ecco l’output:
{"nome":"Mario","cognome":"Rossi","nascita":{"giorno":1,"mese":1,"anno":1980}} Persona [nome=Mario, cognome=Rossi, nascita=Data [giorno=1, mese=1, anno=1980]]
Ecco il secondo esempio/test che utilizza una lista di oggetti di tipo Persona, con le solite due operazioni, creazione e conversione:
package tests; import java.util.ArrayList; import java.util.List; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import model.Data; import model.Persona; public class ObjectsToJSON { public static void main(String[] args) { Persona persona1 = new Persona("Mario", "Rossi", new Data(1, 1, 1980)); Persona persona2 = new Persona("Giuseppe", "Verdi", new Data(10, 10, 1970)); List<Persona> list = new ArrayList<>(); list.add(persona1); list.add(persona2); Gson gson = new Gson(); String jsonString = gson.toJson(list); System.out.println(jsonString); java.lang.reflect.Type listType = new TypeToken<ArrayList<Persona>>() { }.getType(); System.out.println(gson.fromJson(jsonString, listType).toString()); } }
Ed ecco l’output:
[{"nome":"Mario","cognome":"Rossi","nascita":{"giorno":1,"mese":1,"anno":1980}},{"nome":"Giuseppe","cognome":"Verdi","nascita":{"giorno":10,"mese":10,"anno":1970}}] [Persona [nome=Mario, cognome=Rossi, nascita=Data [giorno=1, mese=1, anno=1980]], Persona [nome=Giuseppe, cognome=Verdi, nascita=Data [giorno=10, mese=10, anno=1970]]]
Occorre ricordare, che dal momento che viene usato una libreria esterna dall’ambiante Java, è necessario importarla all’interno del Java Build path. La libreria Gson è facilmente scaricabile da Internet.
Conclusione
JSON è un formato davvero potente e semplice da usare, perché permette di inviare dati/oggetti tra diversi componenti di un sistema software, con diversi linguaggi di programmazione in gioco.