JsonUtility è il namespace ufficiale di Unity per la serializzazione di file Json. Purtroppo però soffre di un problema non da poco: non implementa la serializzazione di array e liste. Questo, per progetto anche solo di poco evoluto, è un grosso problema che però è possibile aggirare usando una libreria molto famosa: Newtonsoft.Json
La guida completa potete trovarla a questo indirizzo.
Il repository Github qui.
Come installare Newtonsoft.Json in Unity
Purtroppo la libreria non ha un package nello Unity Asset Store e quindi va installata tramite repository github.
Accedere quindi al Package Manager e cliccare sul pulsante + in alto a sinistra e cliccare successivamente “Add Package from Git url…”. A questo punto inserire la stringa ufficiale com.unity.nuget.newtonsoft-json ed avviare l’installazione aggiungendo il pacchetto
Come serializzare con Newtonsoft.Json
Per serializzare un oggetto complesso con la libreria è necessario usare la funzione JsonConvert.SerializeObject nel modo seguente:
string json = JsonConvert.SerializeObject(this, Formatting.Indented, new JsonSerializerSettings(){ ReferenceLoopHandling = ReferenceLoopHandling.Error });
La funzione, in questo caso, prende come primo parametro l’oggetto corrente (ma potrebbe benissimo essere un oggetto istanziato di una qualsiasi nostra classe), il tipo di formattazione (indentata, più leggibile) e un parametro di gestione dei loop (in questo caso gli si sta dicendo di lanciare una eccezione nel momento in cui, durante la serializzazione, incontra un loop tra i parametri/sotto oggetti).
E’ necessario indicare però un paio di accorgimenti da applicare ai parametri della classe da serializzare.
- Per gli array mettere sempre la proprietà [JsonProperty(ObjectCreationHandling = ObjectCreationHandling.Replace)] per evitare che aggiunga gli elementi a quelli esistenti, così facendo li ricrea come se fossero vuoti
- Per non serializzare una proprietà usare sull’attributo [JsonIgnore]
Come deserializzare con Newtonsoft.Json
Nella libreria è presente la funzione contraria JsonConvert.DeserializeObject ma purtroppo non ritorna l’oggetto istanziato. La funzione da usare invece è JsonSerializer().Populate che ritorna esattamente l’oggetto istanziato e inizializzato, in questo modo:
new JsonSerializer().Populate(new JsonTextReader(new System.IO.StringReader(json)), this); }
La funzione come primo parametro prende la stringa serializzata dalla funzione precedente e come secondo parametro l’oggetto da ritornare (in questo caso riempiamo l’oggetto corrente, ma potrebbe benissimo essere una istanza nuova di una classe specifica).