Unity hat JsonUtility nach dem 5.3.3- Update zu seiner API hinzugefügt . Vergessen Sie alle Bibliotheken von Drittanbietern, es sei denn, Sie tun etwas Komplizierteres. JsonUtility ist schneller als andere Json-Bibliotheken. Aktualisieren Sie auf Unity 5.3.3 oder höher und probieren Sie die folgende Lösung aus.
JsonUtility
ist eine leichte API. Es werden nur einfache Typen unterstützt. Es ist nicht Sammlungen wie Wörterbücher unterstützen. Eine Ausnahme ist List
. Es unterstützt List
und List
Array!
Wenn Sie eine Datierung serialisieren Dictionary
oder etwas anderes tun müssen, als nur einfache Datentypen zu serialisieren und zu deserialisieren, verwenden Sie eine API eines Drittanbieters. Andernfalls lesen Sie weiter.
Beispielklasse zum Serialisieren:
[Serializable]
public class Player
{
public string playerId;
public string playerLoc;
public string playerNick;
}
1. EIN DATENOBJEKT (NON-ARRAY JSON)
Teil A serialisieren :
Serialisieren Sie mit der public static string ToJson(object obj);
Methode an Json .
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);
Ausgabe :
{"playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"}
Serialisierung von Teil B :
Serialisieren Sie mit der public static string ToJson(object obj, bool prettyPrint);
Methodenüberladung an Json . Durch einfaches Übergeben true
an die JsonUtility.ToJson
Funktion werden die Daten formatiert. Vergleichen Sie die Ausgabe unten mit der Ausgabe oben.
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);
Ausgabe :
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
}
Teil A deserialisieren :
Deserialisieren Sie json mit der public static T FromJson(string json);
Methodenüberladung.
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = JsonUtility.FromJson<Player>(jsonString);
Debug.Log(player.playerLoc);
Teil B deserialisieren :
Deserialisieren Sie json mit der public static object FromJson(string json, Type type);
Methodenüberladung.
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = (Player)JsonUtility.FromJson(jsonString, typeof(Player));
Debug.Log(player.playerLoc);
Teil C deserialisieren :
Deserialisieren Sie json mit der public static void FromJsonOverwrite(string json, object objectToOverwrite);
Methode. Bei JsonUtility.FromJsonOverwrite
Verwendung wird keine neue Instanz des Objekts erstellt, für das Sie deserialisieren. Die übergebene Instanz wird einfach wiederverwendet und ihre Werte überschrieben.
Dies ist effizient und sollte nach Möglichkeit verwendet werden.
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. MEHRERE DATEN (ARRAY JSON)
Ihr Json enthält mehrere Datenobjekte. Zum Beispiel playerId
erschien mehr als einmal . Unity's JsonUtility
unterstützt kein Array, da es noch neu ist. Sie können jedoch eine Hilfsklasse dieser Person verwenden, um das Array zum Arbeiten zu bringen JsonUtility
.
Erstellen Sie eine Klasse namens JsonHelper
. Kopieren Sie den JsonHelper direkt von unten.
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;
}
}
Json-Array serialisieren :
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);
Ausgabe :
{
"Items": [
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
},
{
"playerId": "512343283",
"playerLoc": "User2",
"playerNick": "Rand Nick 2"
}
]
}
Json-Array deserialisieren :
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);
Ausgabe :
Powai
User2
Wenn dies ein Json-Array vom Server ist und Sie es nicht manuell erstellt haben :
Möglicherweise müssen Sie {"Items":
vor der empfangenen Zeichenfolge hinzufügen und }
am Ende hinzufügen .
Ich habe dafür eine einfache Funktion erstellt:
string fixJson(string value)
{
value = "{\"Items\":" + value + "}";
return value;
}
dann können Sie es verwenden:
string jsonString = fixJson(yourJsonFromServer);
Player[] player = JsonHelper.FromJson<Player>(jsonString);
3.Deserialisieren Sie den Json-String ohne Klasse && De-Serialisierung von Json mit numerischen Eigenschaften
Dies ist ein Json, der mit einer Zahl oder numerischen Eigenschaften beginnt.
Beispielsweise:
{
"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
unterstützt dies nicht, da die Eigenschaft "15m" mit einer Zahl beginnt. Eine Klassenvariable kann nicht mit einer Ganzzahl beginnen.
Download SimpleJSON.cs
aus dem Unity- Wiki .
Um die "15m" -Eigenschaft von USD zu erhalten:
var N = JSON.Parse(yourJsonString);
string price = N["USD"]["15m"].Value;
Debug.Log(price);
Um die "15m" -Eigenschaft von ISK zu erhalten:
var N = JSON.Parse(yourJsonString);
string price = N["ISK"]["15m"].Value;
Debug.Log(price);
Um die "15m" -Eigenschaft von NZD zu erhalten:
var N = JSON.Parse(yourJsonString);
string price = N["NZD"]["15m"].Value;
Debug.Log(price);
Der Rest der Json-Eigenschaften, die nicht mit einer numerischen Ziffer beginnen, kann von Unitys JsonUtility verarbeitet werden.
4. FEHLERSUCHE JsonUtility:
Probleme beim Serialisieren mit JsonUtility.ToJson
?
Leere Zeichenfolge oder " {}
" mitJsonUtility.ToJson
?
A . Stellen Sie sicher, dass die Klasse kein Array ist. Wenn dies der Fall ist, verwenden Sie die obige Hilfsklasse mit JsonHelper.ToJson
anstelle vonJsonUtility.ToJson
.
B . Hinzufügen[Serializable]
die Spitze der Klasse hinzu, die Sie serialisieren.
C . Entfernen Sie die Eigenschaft aus der Klasse. Entfernen Sie beispielsweise in der Variablenpublic string playerId { get; set; }
{ get; set; }
. Unity kann dies nicht serialisieren.
Probleme beim Deserialisieren mit JsonUtility.FromJson
?
A . Wenn Sie erhalten Null
, stellen Sie sicher, dass der Json kein Json-Array ist. Wenn dies der Fall ist, verwenden Sie die obige Hilfsklasse mit JsonHelper.FromJson
anstelle von JsonUtility.FromJson
.
B . Wenn Sie NullReferenceException
beim Deserialisieren erhalten, fügen Sie [Serializable]
an der Spitze der Klasse.
C. Überprüfen Sie bei allen anderen Problemen, ob Ihr JSON gültig ist. Gehen Sie auf diese Seite hier und die json einfügen. Es sollte Ihnen zeigen, ob der JSON gültig ist. Es sollte auch die richtige Klasse mit dem Json generieren. Stellen Sie einfach sicher, dass Sie remove { get; set; }
aus jeder Variablen entfernen und [Serializable]
oben in jeder generierten Klasse hinzufügen .
Newtonsoft.Json:
Wenn aus irgendeinem Grund Newtonsoft.Json werden muss , dann schauen Sie in die gegabelten Version für die Einheit verwendet hier . Beachten Sie, dass bei Verwendung einer bestimmten Funktion ein Absturz auftreten kann. Achtung.
Zur Beantwortung Ihrer Frage :
Ihre Originaldaten sind
[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]
Add {"Items":
in Front davon dann fügen }
Sie am Ende davon.
Code dazu:
serviceData = "{\"Items\":" + serviceData + "}";
Jetzt hast du:
{"Items":[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]}
Um die mehreren Daten von PHP als Arrays zu serialisieren , können Sie dies jetzt tun
public player[] playerInstance;
playerInstance = JsonHelper.FromJson<player>(serviceData);
playerInstance[0]
ist Ihre ersten Daten
playerInstance[1]
ist Ihre zweite Daten
playerInstance[2]
ist Ihre dritte Daten
oder Daten innerhalb der Klasse mit playerInstance[0].playerLoc
, playerInstance[1].playerLoc
,playerInstance[2].playerLoc
......
Sie können verwenden playerInstance.Length
die Länge überprüfen, bevor Sie darauf zugreifen.
HINWEIS: Aus der Klasse entfernen . Wenn Sie haben , wird es nicht funktionieren. Unity's funktioniert NICHT mit Klassenmitgliedern, die als Eigenschaften definiert sind .{ get; set; }
player
{ get; set; }
JsonUtility
[
und entfernt]
? Das macht es zu einer Liste. Hören Sie einfach auf, das zu entfernen, und deserialisieren Sie es als Array oder Liste, und ich würde erwarten, dass es in Ordnung ist. Bitte posten Sie den Code, den Sie versucht haben.