Ich habe eine Liste von Elementen, die von einer PHP-Datei an Unity mit gesendet werden WWW
.
Das WWW.text
sieht aus wie:
[
{
"playerId": "1",
"playerLoc": "Powai"
},
{
"playerId": "2",
"playerLoc": "Andheri"
},
{
"playerId": "3",
"playerLoc": "Churchgate"
}
]
Wo ich das Extra []
von der trimme string
. Wenn ich versuche, es mit zu analysieren Boomlagoon.JSON
, wird nur das erste Objekt abgerufen. Ich habe herausgefunden, dass ich zur deserialize()
Liste muss und MiniJSON importiert habe.
Aber ich bin verwirrt, wie zu deserialize()
dieser Liste. Ich möchte jedes JSON-Objekt durchlaufen und Daten abrufen. Wie kann ich dies in Unity mit C # tun?
Die Klasse, die ich benutze, ist
public class player
{
public string playerId { get; set; }
public string playerLoc { get; set; }
public string playerNick { get; set; }
}
Nach dem Trimmen des kann []
ich den json mit MiniJSON analysieren. Aber es gibt nur das erste zurück KeyValuePair
.
IDictionary<string, object> players = Json.Deserialize(serviceData) as IDictionary<string, object>;
foreach (KeyValuePair<string, object> kvp in players)
{
Debug.Log(string.Format("Key = {0}, Value = {1}", kvp.Key, kvp.Value));
}
Vielen Dank!
[
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.List<PlayerLocation>
, denn dies ist ein Array.Newtonsoft.Json
), aber das gibtJson.Deserialize()
IMMER einIDictionary<string,object>
an Sie zurück und Sie operieren weiterList<object>
. Schauen Sie sich stackoverflow.com/a/22745634/5296568 an . Besorgen Sie sich vorzugsweise einen besseren JSON-Deserializer, der die gewohnte Deserialisierung ausführt.IDictionary<string,object>
. Ich kann den Wert herausholen, aber nur den erstenKeyValuePair<>
.Antworten:
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 istList
. Es unterstütztList
undList
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:
1. EIN DATENOBJEKT (NON-ARRAY JSON)
Teil A serialisieren :
Serialisieren Sie mit der
public static string ToJson(object obj);
Methode an Json .Ausgabe :
Serialisierung von Teil B :
Serialisieren Sie mit der
public static string ToJson(object obj, bool prettyPrint);
Methodenüberladung an Json . Durch einfaches Übergebentrue
an dieJsonUtility.ToJson
Funktion werden die Daten formatiert. Vergleichen Sie die Ausgabe unten mit der Ausgabe oben.Ausgabe :
Teil A deserialisieren :
Deserialisieren Sie json mit der
public static T FromJson(string json);
Methodenüberladung.Teil B deserialisieren :
Deserialisieren Sie json mit der
public static object FromJson(string json, Type type);
Methodenüberladung.Teil C deserialisieren :
Deserialisieren Sie json mit der
public static void FromJsonOverwrite(string json, object objectToOverwrite);
Methode. BeiJsonUtility.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.
2. MEHRERE DATEN (ARRAY JSON)
Ihr Json enthält mehrere Datenobjekte. Zum Beispiel
playerId
erschien mehr als einmal . Unity'sJsonUtility
unterstützt kein Array, da es noch neu ist. Sie können jedoch eine Hilfsklasse dieser Person verwenden, um das Array zum Arbeiten zu bringenJsonUtility
.Erstellen Sie eine Klasse namens
JsonHelper
. Kopieren Sie den JsonHelper direkt von unten.Json-Array serialisieren :
Ausgabe :
Json-Array deserialisieren :
Ausgabe :
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:
dann können Sie es verwenden:
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:
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:
Um die "15m" -Eigenschaft von ISK zu erhalten:
Um die "15m" -Eigenschaft von NZD zu erhalten:
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 Variablen
public 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 mitJsonHelper.FromJson
anstelle vonJsonUtility.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
Add
{"Items":
in Front davon dann fügen}
Sie am Ende davon.Code dazu:
Jetzt hast du:
Um die mehreren Daten von PHP als Arrays zu serialisieren , können Sie dies jetzt tun
playerInstance[0]
ist Ihre ersten DatenplayerInstance[1]
ist Ihre zweite DatenplayerInstance[2]
ist Ihre dritte Datenoder 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
quelle
mysql
Abfrage von PHP mit zurückjson_encode($row)
. Die Antwort besteht also aus mehreren JSONObjects im Format[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]
. Ich habe JsonUtility ausprobiert, aber ich konnte die Objekte nicht deserialisieren und einzelne Json-Objekte abrufen. Wenn du mir dabei helfen kannst.JsonUtility.FromJson
. Ich habe vergessen, dir zu sagen, dass du{ get; set; }
aus derplayer
Klasse aussteigen sollst . Wenn Sie haben{ get; set; }
, wird es nicht funktionieren. Vergleichen Sie Ihreplayer
Klasse mit der, die ich oben gepostet habe, und Sie werden verstehen, was ich sage.JsonHelper
. Das ist gut. Wenn Sie Json damit erstellen, können Sie Json auch ohne zusätzliche Schritte damit lesen. Das einzige Mal, dass Sie zusätzliche Dinge tun müssen, ist, wenn Sie das JSON-Array vom Server empfangen und das in der Lösung enthalten ist, ist in meiner Antwort. Ein anderer Weg ohneJsonHelper
ist, die Klasse in eine andere Klasse zu setzen und sie dann zu einer zu machenList
. Dies hat für die meisten Menschen funktioniert. Wenn Sie nach einer Möglichkeit suchen, Spieldaten zu speichern und zu laden, sehen Sie sich diese an . Sie laden und speichern mit einer Codezeile.Angenommen, Sie haben einen solchen JSON
Um den obigen JSON in Einheit zu analysieren, können Sie ein JSON-Modell wie dieses erstellen.
Und dann einfach folgendermaßen analysieren ...
Jetzt können Sie den JSON / CODE nach Bedarf ändern. https://docs.unity3d.com/Manual/JSONSerialization.html
quelle
Debug.Log(myObject.result[0].symbol[0].data);
for(var i = 0; i <= myObject.result.Length - 1; i ++) { Debug.Log(myObject.result[i].type); }
foreach (var item in myObject.result) { Debug.Log(item.type); }
Sie müssen hinzufügen
[System.Serializable]
zuPlayerItem
Klasse, wie folgt aus :quelle
Schneiden Sie das nicht
[]
und es sollte Ihnen gut gehen.[]
Identifizieren Sie ein JSON-Array, das genau das ist, was Sie benötigen, um seine Elemente iterieren zu können.quelle
Wie @Maximiliangerhardt sagte, hat MiniJson nicht die Fähigkeit, richtig zu deserialisieren. Ich habe JsonFx verwendet und arbeite wie ein Zauber. Arbeitet mit dem
[]
quelle
Informationen zum Lesen der JSON-Datei finden Sie in diesem einfachen Beispiel
Ihre JSON-Datei (StreamingAssets / Player.json)
C # -Skript
quelle
Sie können
Newtonsoft.Json
einfachNewtonsoft.dll
zu Ihrem Projekt hinzufügen und das folgende Skript verwendenEine andere Lösung ist die Verwendung von JsonHelper
quelle
Wenn Sie Vector3 verwenden, habe ich dies getan
1- Ich erstelle eine Klasse Name it Player
2- dann nenne ich es so
3- und das ist das Ergebnis
quelle
Einheit <= 2019
Narottam Goyal hatte eine gute Idee, das Array in ein JSON-Objekt zu verpacken und dann in eine Struktur zu deserialisieren. Im Folgenden werden Generika verwendet, um dies für Arrays aller Art zu lösen, anstatt jedes Mal eine neue Klasse zu erstellen.
Es kann folgendermaßen verwendet werden:
Einheit 2020
In Unity 2020 gibt es ein offizielles NewtonSoft- Paket, eine weitaus bessere JSON-Bibliothek.
quelle