Quiero obtener datos del archivo json correctamente. El archivo de datos json que modelé para esto es el siguiente:
{ "Free title 1":[ { "Subject": "a1", "Relation": "a2" }, { "Subject": "b1", "Relation": "b2" } ], "Another free title":[ { "Subject": "z1", "Relation": "z2" }, { "Subject": "y1", "Relation": "y2" } ], "Unordered title":[ { "Subject": "x1", "Relation": "x2" }, { "Subject": "w1", "Relation": "w2" } ] }Así es como creo una clase de objeto:
public class _Infos_ { public List<_Info_> Infos { get; set; } } public class _Info_ { public string Subject { get; set; } public string Relation { get; set; } }Y finalmente estoy tratando de obtener los datos en un método como este:
var js = JsonConvert.DeserializeObject<_Infos_>(File.ReadAllText("__FILE_PATH__")); foreach (var j in js.Infos) { MessageBox.Show(j.Subject); } Recibo el error de que js está vacío. Aquí quiero obtener Free title 1 , Another free title y el título Unordered title en una lista. Por supuesto, estos títulos cambiarán constantemente. Luego, quiero obtener los datos de Subject y Relation bajo estos títulos. Pero no tengo ni idea de cómo conseguirlo.
Su definición de clase es un poco incorrecta. Puede usar las herramientas en línea "json to c#" para generar las clases correctas. como este: https://json2csharp.com
Su "raíz" de su json, por ejemplo, no contiene una matriz en su json. La propiedad "Free title 1":[..] es una matriz, por lo que su raíz necesita una propiedad con el nombre FreeTitle1 y tiene que ser una matriz/lista.
public class Root { [JsonProperty("Free title 1")] public List<TitleInfo> FreeTitle1 { get; set; } [JsonProperty("Another free title")] public List<TitleInfo> AnotherFreeTitle { get; set; } [JsonProperty("Unordered title")] public List<TitleInfo> UnorderedTitle { get; set; } } public class TitleInfo { public string Subject { get; set; } public string Relation { get; set; } }Si los miembros de su objeto tienen nombres dinámicos, también puede deserializar manualmente el objeto, por ejemplo, utilizando el tipo general JObject . P.ej
JObject obj = JObject.Parse(File.ReadAllText("__FILE_PATH__")); JObject implementa IEnumerable<KeyValuePair<string, JToken>> sobre el que puede iterar. Cada miembro tendrá JToken Value , que es un JArray en este caso, que puede convertir a una List de su tipo.
foreach (var groups in obj) { var infos = groups.Value.ToObject<List<_Info_>>(); // .. loop over infos }Esta estructura de datos es un diccionario de colecciones de _Info_ s. Debe deserializarlo a Dictionary<string, List<_Info_>> .
Aquí hay ejemplos de System.Text.Json y Json.net:
var d = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, List<_Info_>>>(json); var d2 = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, List<_Info_>>>(json);