Unity ha aggiunto JsonUtility alla propria API dopo l' aggiornamento 5.3.3 . Dimentica tutte le librerie di terze parti a meno che tu non stia facendo qualcosa di più complicato. JsonUtility è più veloce di altre librerie Json. Aggiorna alla versione Unity 5.3.3 o successiva, quindi prova la soluzione di seguito.
JsonUtility
è un'API leggera. Sono supportati solo i tipi semplici. Esso non supporta le collezioni, come dizionario. Un'eccezione è List
. Supporta List
e List
schiera!
Se è necessario serializzare Dictionary
o eseguire operazioni diverse dalla serializzazione e deserializzazione di tipi di dati semplici, utilizzare un'API di terze parti. Altrimenti, continua a leggere.
Classe di esempio da serializzare:
[Serializable]
public class Player
{
public string playerId;
public string playerLoc;
public string playerNick;
}
1. UN OGGETTO DI DATI (JSON NON ARRAY)
Serializzazione della parte A :
Serializza su Json con il public static string ToJson(object obj);
metodo.
Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";
//Convert to JSON
string playerToJson = JsonUtility.ToJson(playerInstance);
Debug.Log(playerToJson);
Uscita :
{"playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"}
Serializzazione della parte B :
Serializza in Json con l' public static string ToJson(object obj, bool prettyPrint);
overload del metodo. Il semplice passaggio true
alla JsonUtility.ToJson
funzione formatterà i dati. Confronta l'output sotto con l'output sopra.
Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";
//Convert to JSON
string playerToJson = JsonUtility.ToJson(playerInstance, true);
Debug.Log(playerToJson);
Uscita :
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
}
Deserializzazione della parte A :
Deserializza json con l' public static T FromJson(string json);
overload del metodo.
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = JsonUtility.FromJson<Player>(jsonString);
Debug.Log(player.playerLoc);
Deserializzazione della parte B :
Deserializza json con l' public static object FromJson(string json, Type type);
overload del metodo.
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = (Player)JsonUtility.FromJson(jsonString, typeof(Player));
Debug.Log(player.playerLoc);
Deserializzazione della parte C :
Deserializza json con il public static void FromJsonOverwrite(string json, object objectToOverwrite);
metodo. Quando JsonUtility.FromJsonOverwrite
viene utilizzato, non verrà creata alcuna nuova istanza dell'oggetto che si desidera deserializzare. Riutilizzerà semplicemente l'istanza trasmessa e ne sovrascriverà i valori.
Questo è efficiente e dovrebbe essere usato se possibile.
Player playerInstance;
void Start()
{
//Must create instance once
playerInstance = new Player();
deserialize();
}
void deserialize()
{
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
//Overwrite the values in the existing class instance "playerInstance". Less memory Allocation
JsonUtility.FromJsonOverwrite(jsonString, playerInstance);
Debug.Log(playerInstance.playerLoc);
}
2. DATI MULTIPLI (ARRAY JSON)
Il tuo Json contiene più oggetti dati. Ad esempio è playerId
apparso più di una volta . Unity's JsonUtility
non supporta l'array poiché è ancora nuovo, ma puoi usare una classe helper di questa persona per far funzionare l' arrayJsonUtility
.
Crea una classe chiamata JsonHelper
. Copia il JsonHelper direttamente dal basso.
public static class JsonHelper
{
public static T[] FromJson<T>(string json)
{
Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
return wrapper.Items;
}
public static string ToJson<T>(T[] array)
{
Wrapper<T> wrapper = new Wrapper<T>();
wrapper.Items = array;
return JsonUtility.ToJson(wrapper);
}
public static string ToJson<T>(T[] array, bool prettyPrint)
{
Wrapper<T> wrapper = new Wrapper<T>();
wrapper.Items = array;
return JsonUtility.ToJson(wrapper, prettyPrint);
}
[Serializable]
private class Wrapper<T>
{
public T[] Items;
}
}
Serializzazione di Json Array :
Player[] playerInstance = new Player[2];
playerInstance[0] = new Player();
playerInstance[0].playerId = "8484239823";
playerInstance[0].playerLoc = "Powai";
playerInstance[0].playerNick = "Random Nick";
playerInstance[1] = new Player();
playerInstance[1].playerId = "512343283";
playerInstance[1].playerLoc = "User2";
playerInstance[1].playerNick = "Rand Nick 2";
//Convert to JSON
string playerToJson = JsonHelper.ToJson(playerInstance, true);
Debug.Log(playerToJson);
Uscita :
{
"Items": [
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
},
{
"playerId": "512343283",
"playerLoc": "User2",
"playerNick": "Rand Nick 2"
}
]
}
Deserializzazione di Json Array :
string jsonString = "{\r\n \"Items\": [\r\n {\r\n \"playerId\": \"8484239823\",\r\n \"playerLoc\": \"Powai\",\r\n \"playerNick\": \"Random Nick\"\r\n },\r\n {\r\n \"playerId\": \"512343283\",\r\n \"playerLoc\": \"User2\",\r\n \"playerNick\": \"Rand Nick 2\"\r\n }\r\n ]\r\n}";
Player[] player = JsonHelper.FromJson<Player>(jsonString);
Debug.Log(player[0].playerLoc);
Debug.Log(player[1].playerLoc);
Uscita :
Powai
Utente2
Se questo è un array Json dal server e non l'hai creato manualmente :
Potrebbe essere necessario aggiungere {"Items":
prima della stringa ricevuta, quindi aggiungere }
alla fine di essa.
Ho creato una semplice funzione per questo:
string fixJson(string value)
{
value = "{\"Items\":" + value + "}";
return value;
}
allora puoi usarlo:
string jsonString = fixJson(yourJsonFromServer);
Player[] player = JsonHelper.FromJson<Player>(jsonString);
3.Deserializza la stringa JSON senza classe && De-serializza Json con proprietà numeriche
Questo è un Json che inizia con un numero o proprietà numeriche.
Per esempio:
{
"USD" : {"15m" : 1740.01, "last" : 1740.01, "buy" : 1740.01, "sell" : 1744.74, "symbol" : "$"},
"ISK" : {"15m" : 179479.11, "last" : 179479.11, "buy" : 179479.11, "sell" : 179967, "symbol" : "kr"},
"NZD" : {"15m" : 2522.84, "last" : 2522.84, "buy" : 2522.84, "sell" : 2529.69, "symbol" : "$"}
}
Unity's JsonUtility
non lo supporta perché la proprietà "15m" inizia con un numero. Una variabile di classe non può iniziare con un numero intero.
Scarica SimpleJSON.cs
dal wiki di Unity .
Per ottenere la proprietà "15 m" di USD:
var N = JSON.Parse(yourJsonString);
string price = N["USD"]["15m"].Value;
Debug.Log(price);
Per ottenere la proprietà "15 m" di ISK:
var N = JSON.Parse(yourJsonString);
string price = N["ISK"]["15m"].Value;
Debug.Log(price);
Per ottenere la proprietà "15 m" di NZD:
var N = JSON.Parse(yourJsonString);
string price = N["NZD"]["15m"].Value;
Debug.Log(price);
Il resto delle proprietà Json che non inizia con una cifra numerica possono essere gestite da JsonUtility di Unity.
4. RISOLUZIONE DEI PROBLEMI JsonUtility:
Problemi durante la serializzazione con JsonUtility.ToJson
?
Ricevi una stringa vuota o " {}
" con JsonUtility.ToJson
?
A . Assicurati che la classe non sia un array. Se lo è, usa la classe helper sopra con JsonHelper.ToJson
invece di JsonUtility.ToJson
.
B . Aggiungi [Serializable]
all'inizio della classe che stai serializzando.
C . Rimuovi proprietà dalla classe. Ad esempio, nella variabile, public string playerId { get; set; }
rimuovi { get; set; }
. Unity non può serializzare questo.
Problemi durante la deserializzazione con JsonUtility.FromJson
?
A . In Null
tal caso , assicurati che Json non sia un array Json. Se lo è, usa la classe helper sopra con JsonHelper.FromJson
invece di JsonUtility.FromJson
.
B . Se si ottiene NullReferenceException
durante la deserializzazione, aggiungere [Serializable]
in cima alla classe.
C. Eventuali altri problemi, verifica che il tuo json sia valido. Vai su questo sito qui e incolla il file json. Dovrebbe mostrarti se il json è valido. Dovrebbe anche generare la classe corretta con Json. Assicurati solo di rimuovere remove { get; set; }
da ogni variabile e aggiungi anche [Serializable]
all'inizio di ogni classe generata.
Newtonsoft.Json:
Se per qualche motivo è necessario utilizzare Newtonsoft.Json, controlla la versione biforcuta per Unity qui . Tieni presente che potresti riscontrare un arresto anomalo se viene utilizzata una determinata funzione. Stai attento.
Per rispondere alla tua domanda :
I tuoi dati originali sono
[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]
Aggiungere {"Items":
a fronte di esso poi aggiungere }
alla fine di esso.
Codice per fare questo:
serviceData = "{\"Items\":" + serviceData + "}";
Adesso hai:
{"Items":[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]}
Per serializzare i molteplici dati dal PHP come array , ora è possibile farlo
public player[] playerInstance;
playerInstance = JsonHelper.FromJson<player>(serviceData);
playerInstance[0]
sono i tuoi primi dati
playerInstance[1]
sono i tuoi secondi dati
playerInstance[2]
è il terzo dato
o dati all'interno della classe con playerInstance[0].playerLoc
, playerInstance[1].playerLoc
, playerInstance[2].playerLoc
......
È possibile utilizzare playerInstance.Length
per verificare la lunghezza prima di accedervi.
NOTA: rimuovere { get; set; }
dalla player
classe. Se lo hai { get; set; }
, non funzionerà. Unity JsonUtility
fa NON lavorare con i membri della classe che sono definiti come proprietà .
[
e]
? Questo è ciò che lo rende un elenco. Smetti di rimuoverlo e deserializzalo come un array o un elenco e mi aspetto che vada bene. Inserisci il codice che hai provato.