J'ai une liste d'éléments envoyés depuis un fichier PHP vers unity en utilisant WWW
.
Le WWW.text
ressemble à:
[
{
"playerId": "1",
"playerLoc": "Powai"
},
{
"playerId": "2",
"playerLoc": "Andheri"
},
{
"playerId": "3",
"playerLoc": "Churchgate"
}
]
Où je coupe le supplément []
du string
. Lorsque j'essaye de l'analyser en utilisant Boomlagoon.JSON
, seul le premier objet est récupéré. J'ai découvert que je suis sur deserialize()
la liste et que j'ai importé MiniJSON.
Mais je ne sais pas comment deserialize()
cette liste. Je veux parcourir chaque objet JSON et récupérer des données. Comment puis-je faire cela dans Unity en utilisant C #?
La classe que j'utilise est
public class player
{
public string playerId { get; set; }
public string playerLoc { get; set; }
public string playerNick { get; set; }
}
Après avoir coupé le, []
je suis capable d'analyser le json en utilisant MiniJSON. Mais il ne renvoie que le premier 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));
}
Merci!
[
et]
? C'est ce qui en fait une liste. Arrêtez simplement de supprimer cela et désérialisez-le sous forme de tableau ou de liste et je m'attendrais à ce que tout se passe bien. Veuillez publier le code que vous avez essayé.List<PlayerLocation>
, car il s'agit d' un tableau.Newtonsoft.Json
), maisJson.Deserialize()
TOUJOURS vous renvoie unIDictionary<string,object>
et vous opérezList<object>
. Regardez stackoverflow.com/a/22745634/5296568 . De préférence, obtenez un meilleur désérialiseur JSON qui effectue la désérialisation à laquelle vous êtes habitué.IDictionary<string,object>
. Je suis capable d'en tirer la valeur, mais seulement le premierKeyValuePair<>
.Réponses:
Unity a ajouté JsonUtility à son API après la mise à jour 5.3.3 . Oubliez toutes les bibliothèques tierces à moins que vous ne fassiez quelque chose de plus compliqué. JsonUtility est plus rapide que les autres bibliothèques Json. Mettez à jour vers la version Unity 5.3.3 ou supérieure, puis essayez la solution ci-dessous.
JsonUtility
est une API légère. Seuls les types simples sont pris en charge. Il ne prend pas en charge les collections telles que Dictionary. Une exception estList
. Il prend en chargeList
etList
tableau!Si vous devez sérialiser un
Dictionary
ou faire autre chose que simplement sérialiser et désérialiser des types de données simples, utilisez une API tierce. Sinon, continuez à lire.Exemple de classe à sérialiser:
1. UN OBJET DE DONNÉES (JSON NON-ARRAY)
Sérialisation de la partie A :
Sérialisez vers Json avec la
public static string ToJson(object obj);
méthode.Sortie :
Sérialisation de la partie B :
Sérialisez vers Json avec la
public static string ToJson(object obj, bool prettyPrint);
surcharge de méthode. Le simple fait de passertrue
à laJsonUtility.ToJson
fonction formatera les données. Comparez la sortie ci-dessous à la sortie ci-dessus.Sortie :
Désérialisation de la partie A :
Désérialisez json avec la
public static T FromJson(string json);
surcharge de méthode.Désérialisation de la partie B :
Désérialisez json avec la
public static object FromJson(string json, Type type);
surcharge de méthode.Désérialisation de la partie C :
Désérialisez json avec la
public static void FromJsonOverwrite(string json, object objectToOverwrite);
méthode. QuandJsonUtility.FromJsonOverwrite
est utilisé, aucune nouvelle instance de cet objet que vous désérialisez ne sera créée. Il réutilisera simplement l'instance que vous transmettez et écrasera ses valeurs.Ceci est efficace et doit être utilisé si possible.
2. DONNÉES MULTIPLES (ARRAY JSON)
Votre Json contient plusieurs objets de données. Par exemple
playerId
est apparu plus d' une fois . UnityJsonUtility
ne prend pas en charge le tableau car il est encore nouveau, mais vous pouvez utiliser une classe d' assistance de cette personne pour faire fonctionner le tableauJsonUtility
.Créez une classe appelée
JsonHelper
. Copiez le JsonHelper directement à partir du dessous.Sérialisation de la baie Json :
Sortie :
Désérialisation de Json Array :
Sortie :
S'il s'agit d'un tableau Json du serveur et que vous ne l'avez pas créé à la main :
Vous devrez peut-être ajouter
{"Items":
devant la chaîne reçue, puis ajouter}
à la fin de celle-ci.J'ai fait une fonction simple pour cela:
alors vous pouvez l'utiliser:
3. désérialiser la chaîne json sans classe && désérialiser Json avec des propriétés numériques
Il s'agit d'un Json qui commence par un nombre ou des propriétés numériques.
Par exemple:
Unity's
JsonUtility
ne prend pas en charge cela car la propriété "15m" commence par un nombre. Une variable de classe ne peut pas commencer par un entier.Téléchargez à
SimpleJSON.cs
partir du wiki d'Unity .Pour obtenir la propriété "15m" de USD:
Pour obtenir la propriété "15m" d'ISK:
Pour obtenir la propriété "15m" de NZD:
Le reste des propriétés Json qui ne commencent pas par un chiffre numérique peuvent être gérés par JsonUtility d'Unity.
4.DÉPANNAGE JsonUtility:
Problèmes lors de la sérialisation avec
JsonUtility.ToJson
?Obtenir une chaîne vide ou "
{}
" avecJsonUtility.ToJson
?A . Assurez-vous que la classe n'est pas un tableau. Si tel est le cas, utilisez la classe d'assistance ci-dessus avec
JsonHelper.ToJson
au lieu deJsonUtility.ToJson
.B . Ajoutez
[Serializable]
en haut de la classe que vous sérialisez.C . Supprimez la propriété de la classe. Par exemple, dans la variable,
public string playerId { get; set; }
supprimez{ get; set; }
. Unity ne peut pas sérialiser cela.Problèmes lors de la désérialisation avec
JsonUtility.FromJson
?A . Si vous obtenez
Null
, assurez-vous que Json n'est pas un tableau Json. Si tel est le cas, utilisez la classe d'assistance ci-dessus avecJsonHelper.FromJson
au lieu deJsonUtility.FromJson
.B . Si vous obtenez
NullReferenceException
lors de la désérialisation, ajoutez[Serializable]
en haut de la classe.C. Pour tout autre problème, vérifiez que votre json est valide. Allez sur ce site ici et collez le fichier json. Il devrait vous montrer si le json est valide. Il devrait également générer la classe appropriée avec le Json. Assurez-vous simplement de supprimer remove
{ get; set; }
de chaque variable et d'ajouter également[Serializable]
en haut de chaque classe générée.Newtonsoft.Json:
Si pour une raison quelconque Newtonsoft.Json doit être utilisé, consultez la version fourchue pour Unity ici . Notez que vous pouvez rencontrer des plantages si certaines fonctionnalités sont utilisées. Faites attention.
Pour répondre à votre question :
Vos données d'origine sont
Ajouter
{"Items":
à l' avant de celui - ci , puis ajouter}
à la fin de celui - ci.Code pour ce faire:
Maintenant vous avez:
Pour sérialiser les multiples données de php sous forme de tableaux , vous pouvez maintenant faire
playerInstance[0]
est vos premières donnéesplayerInstance[1]
est votre deuxième donnéeplayerInstance[2]
est votre troisième donnéeou des données à l' intérieur de la classe
playerInstance[0].playerLoc
,playerInstance[1].playerLoc
,playerInstance[2].playerLoc
......Vous pouvez utiliser
playerInstance.Length
pour vérifier la longueur avant d'y accéder.REMARQUE: retirez
{ get; set; }
de laplayer
classe. Si c'est le cas{ get; set; }
, cela ne fonctionnera pas. UnityJsonUtility
ne fonctionne PAS avec les membres de classe définis comme propriétés .la source
mysql
requête de PHP en utilisantjson_encode($row)
. La réponse se compose donc de plusieurs JSONObjects au format[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]
. J'ai essayé JsonUtility, mais je ne pouvais pas désérialiser les objets et obtenir des objets json individuels. Si vous pouvez m'aider avec ça.JsonUtility.FromJson
. J'ai oublié de vous dire de vous retirer{ get; set; }
de laplayer
classe. Si vous en avez{ get; set; }
, cela ne fonctionnera pas. Comparez votreplayer
classe avec celle que j'ai postée ci-dessus et vous comprendrez ce que je dis.JsonHelper
. C'est bon. Si vous créez Json avec lui, vous pouvez également lire json avec lui sans étapes supplémentaires. Le seul moment où vous devrez peut-être faire des choses supplémentaires est si vous recevez le tableau json du serveur et que cela est inclus dans la solution est dans ma réponse. Une autre façon sansJsonHelper
est de mettre la classe dans une autre classe puis d'en faire unList
. Cela a fonctionné pour la plupart des gens. Si vous cherchez un moyen de sauvegarder et de charger les données du jeu, voyez ceci . Vous chargez et enregistrez avec une ligne de code.Supposons que vous ayez un JSON comme celui-ci
Pour analyser le JSON ci-dessus à l'unité, vous pouvez créer un modèle JSON comme celui-ci.
Et puis analysez simplement de la manière suivante ...
Vous pouvez maintenant modifier le JSON / CODE en fonction de vos besoins. https://docs.unity3d.com/Manual/JSONSerialization.html
la source
Debug.Log(myObject.result[0].symbol[0].data);
oufor(var i = 0; i <= myObject.result.Length - 1; i ++) { Debug.Log(myObject.result[i].type); }
ouforeach (var item in myObject.result) { Debug.Log(item.type); }
vous devez ajouter
[System.Serializable]
à laPlayerItem
classe, comme ceci:la source
Ne coupez pas le
[]
et tout devrait aller bien.[]
identifiez un tableau JSON qui est exactement ce dont vous avez besoin pour pouvoir itérer ses éléments.la source
Comme @Maximiliangerhardt l'a dit, MiniJson n'a pas la capacité de désérialiser correctement. J'ai utilisé JsonFx et fonctionne comme un charme. Fonctionne avec le
[]
la source
Pour lire le fichier JSON, reportez-vous à cet exemple simple
Votre fichier JSON (StreamingAssets / Player.json)
Script C #
la source
Vous pouvez utiliser
Newtonsoft.Json
simplement ajouterNewtonsoft.dll
à votre projet et utiliser le script ci-dessousune autre solution utilise JsonHelper
la source
SI vous utilisez Vector3, c'est ce que j'ai fait
1- Je crée une classe Name it Player
2- alors je l'appelle comme ça
3- et c'est le résultat
la source
Unité <= 2019
Narottam Goyal a eu une bonne idée d'encapsuler le tableau dans un objet json, puis de le désérialiser dans une structure. Ce qui suit utilise Generics pour résoudre ce problème pour les tableaux de tous types, par opposition à la création d'une nouvelle classe à chaque fois.
Il peut être utilisé de la manière suivante:
Unity 2020
Dans Unity 2020, il existe un package newtonsoft officiel qui est une bien meilleure bibliothèque json.
la source