Entonces mi pregunta es doble, primero tengo un comportamiento que no entiendo y se debe a que no entendí algo sobre Json. Entonces, dado el primer ejemplo a continuación, obtengo lo que quiero.
{ "data":{ "stats":{ "kills":0, "gamesPlayed":30, "shotsFired":30 } }, "other":1 }código:
JsonData jsonData = JsonMapper.ToObject (jsonString); JsonData entries = jsonData["data"]["stats"]; m_kills = int.Parse(entries["kills"].ToString()); Debug.log(m_kills);salida
"0"
Sin embargo, cuando uso la misma lógica detrás del código para este próximo json, aparece un error. Entonces, ¿por qué cuando se usa el siguiente Json y el código?
{ "data":{ "otherInfo":2, "scoreboard":[ { "player":"bob", "score":57, "pdata":{ "a":40, "b":20 } }, { "player":"joe", "score":32, "pdata":{ "a":20, "b":13 } } ], "otherInfo2":5 } }código
JsonData jsonData = JsonMapper.ToObject (jsonString); JsonData entries = jsonData["data"]; m_info = int.Parse(entries["otherinfo"].ToString()); Debug.log(m_info);yo obtengo
KeyNotFoundException: la clave dada no estaba presente en el diccionario. System.Collections.Generic.Dictionary`2[TKey,TValue].get_Item (clave TKey) (en <567df3e0919241ba98db88bec4c6696f>:0)
¿Qué está mal dentro?
JsonData entries = jsonData["data"]; m_info = int.Parse(entries["otherinfo"].ToString());En cuanto a la segunda parte, la primera parte es solo para que pueda entenderla mejor. Mi objetivo final es obtener acceso a la puntuación de cada jugador (más allá de bob y joe quieren que sea ampliable) y luego también tomar los pdata... así que supongo que la pregunta es triple, pero la ayuda en cualquiera de estos 3 sería muy apreciada. !
Gracias
Debe crear un modelo de datos para su json. Después de eso, puede convertir su cadena json en un objeto válido para alcanzar su propiedad necesaria.
// the data models based on your json string public class Pdata { public int a { get; set; } public int b { get; set; } } public class Scoreboard { public string player { get; set; } public int score { get; set; } public Pdata pdata { get; set; } } public class Data { public int otherInfo { get; set; } public List<Scoreboard> scoreboard { get; set; } public int otherInfo2 { get; set; } } public class Root { public Data data { get; set; } } // code Root root = JsonConvert.DeserializeObject<Root>(yourJsonString); int otherInfo = root.data.otherInfo;Puede crear fácilmente sus modelos en https://json2csharp.com/
También me tomó un tiempo detectarlo, ¡pero su error parece ser un error tipográfico!
En el json es "otherInfo":2 pero está intentando acceder a las entries["otherinfo"] .
En general, debería implementar la estructura de datos de acuerdo con c# ( json2csharp ayuda)
[Serializable] public class Pdata { public int a; public int b; } [Serializable] public class Player { public string player; public int score; public Pdata pdata; } [Serializable] public class Data { public int otherInfo; public List<Player> scoreboard; public int otherInfo2; } [Serializable] public class Root { public Data data; } Y luego use JsonUtility.FromJson
var root = JsonUtility.FromJson<Root>(jsonString); Debug.Log($"otherInfo: {root.data.otherInfo}"); foreach(var player in root.data.scoreboard) { Debug.Log($"Name: {player.player}, Score: {player.score}, A: {player.pdata.a}"); } Para su estructura de datos actual, no recomendaría luchar con bibliotecas de terceros, JsonUtility está bien aquí.
Sin embargo, la deserialización de la JsonUtility integrada de Unity es bastante limitada (consulte Unity - Serialización de scripts ).
Si se vuelve más complejo y desea usar, por ejemplo, Diccionarios en el futuro, tendrá que usar algo más como, por ejemplo Newtonsoft .NET JSON .
Entonces sería
var root = JsonConvert.DeserializeObject<Root>(jsonString); ...Te falta '{' al principio y '}' al final de tu JSON.