JSON e Java, come si semplifica la vita con Gson

JSON e Java, come si semplifica la vita con Gson

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 e false);
  • 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.

ismanettoneblog