Y a-t-il un moyen dans Unity d'analyser une chaîne JSON en une classe C # qui a une liste de chaînes - supposons -?
J'ai une application qui récupère beaucoup de données d'un serveur. Ces données sont fournies dans un JSON et comportent de nombreux champs. Certains champs contiennent un autre tableau (je connais ceux qui ont un tableau à l'intérieur et ceux qui n'en ont pas).
Sachant cela, je veux en faire une classe pour pouvoir accéder à ses paramètres, [Je ne peux pas créer un tableau et essayer d'accéder - par exemple - à arr [0], car arr [0] n'est peut-être pas le champ que je veux - étant donné que les positions du tableau peuvent changer, mais la clé de champ (ou field-field-key si le tableau a un tableau à l'intérieur) la valeur ne sera pas]
[System.Serializable]
public class Menu
{
public string id_menu { get; set; }
public string nome { get; set; }
public string tipo { get; set; }
}
[System.Serializable]
public class Return
{
public string success { get; set; }
public List<Menu> menus { get; set; }
}
Le code ci-dessus est l'un des JSONS que je veux analyser, et le code ci-dessous est la classe que j'ai créée pour l'analyser. Maintenant, j'ai juste besoin de savoir comment le faire.
{
"success": "1",
"menus": [
{
"id_menu": "506",
"nome": "Blog",
"tipo": "blog"
},
{
"id_menu": "510",
"nome": "Sobre",
"tipo": ""
},
{
"id_menu": "2407",
"nome": "(Projeto Quatro Artes)",
"tipo": ""
},
{
"id_menu": "2603",
"nome": "(Loja)",
"tipo": ""
},
{
"id_menu": "2687",
"nome": "(Material NA)",
"tipo": ""
},
{
"id_menu": "2818",
"nome": "(Forms)",
"tipo": ""
},
{
"id_menu": "2826",
"nome": "(PHP+PIZZA)",
"tipo": ""
},
{
"id_menu": "7728",
"nome": "(Image)",
"tipo": ""
},
{
"id_menu": "3239",
"nome": "(jc)",
"tipo": ""
},
{
"id_menu": "6024",
"nome": "(assinatura)",
"tipo": ""
}
]
}
Je sais que JsonUtility.FromJson () peut faire le travail s'il n'y a pas de listes, mais avec des listes ne fonctionne tout simplement pas De plus, essayer d'utiliser JSONObject à partir d'actifs Unity ne fonctionne pas non plus car je ne peux pas accéder à return.menus.tipo (à titre d'exemple) car il n'a pas d'index associatif.
3 Réponses :
Si vous essayez d'analyser le Json via Unity, vous pouvez utiliser le JsonUtility.FromJson (jsonString), il analysera le Json en un objet, qu'il peut gérer, mais je n'ai jamais essayé d'utiliser avec des JSON complexes. p >
Ou vous pouvez parcourir le json et rechercher la valeur de clé souhaitée, mais cela augmente certainement la consommation de mémoire.
Oui, et pour une raison quelconque, cela ne fonctionne pas, les valeurs «succès» et la liste ne contiennent rien.
vous pouvez le faire de la manière suivante:
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Text;
namespace IoException
{
[System.Serializable]
public class Menu
{
public string id_menu { get; set; }
public string nome { get; set; }
public string tipo { get; set; }
}
[System.Serializable]
public class Return
{
public string success { get; set; }
public List<Menu> menus { get; set; }
}
public class JsonExercise
{
public static void Main(string[] args)
{
var currentLine = Console.ReadLine();
var sb = new StringBuilder();
while (currentLine != "END")
{
sb.AppendLine(currentLine);
currentLine = Console.ReadLine();
}
var json = sb.ToString().Trim();
var returnObj = JsonConvert.DeserializeObject<Return>(json);
Console.WriteLine();
}
}
}
Pour que cela fonctionne, vous avez besoin du package suivant: Newtonsoft.Json
J'ai créé une petite application console, qui vous montre le chemin. Il devrait en être de même dans Unity:
var returnObj = JsonConvert.DeserializeObject<Return>(json);
Remarques sur l'application console, au cas où vous voudriez l'essayer:
Juste pour être sûr que d'autres personnes. Newtonsoft ne fonctionne pas avec Unity3D, normalement. Mais quelqu'un l'a fourchu et l'a fait fonctionner! github.com/codecapers/Unity.Newtonsoft.Json
Peut-être utiliser Json.NET ou un autre désérialiseur qui prend entièrement en charge les types arbitraires?
public class MyClass
{
public string id_menu { get; set; }
public string nome { get; set; }
public string tipo { get; set; }
public List<string> my_list {get; set; }
}
var result = JsonConvert.DeserializeObject<MyClass>(json);
Merci d'avoir répondu! Mais malheureusement Unity3D ne me laisse pas utiliser la bibliothèque Newtonsoft. Il y a beaucoup de conflits avec les classes dans Unity qu'il n'est pas possible de résoudre.