Skip to content Skip to sidebar Skip to footer

Serializzare oggetti in Unity con Newtonsoft.Json – Alternativa a JsonUtility

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).

Leave a comment