marc indicadores formato etiqueta ejemplos campo c# json json.net deserialization

indicadores - JSON a C#: enumere los campos sin nombres de subcampo en json?



indicadores marc 21 (2)

Utilizando Json.net (Newtonsoft.json), ¿cómo puedo definir una clase C (o clases) para manejar el json a continuación?

El campo ''datos'' parece ser una lista de subcampos de nivel / descripción, pero tenga en cuenta que no están precedidos por nombres de campo.

El campo ''error'' parece ser una lista de subcampos de número de error / mensaje de error, pero tenga en cuenta que ellos tampoco están precedidos por nombres de campo.

{ "status": "error", "data": [ { "warning" : "your input was wrong" } ], "error": [ { "373": "Error description goes here" } ] }

Esta definición de clase no genera errores de análisis; sin embargo, el contenido de Datos y Errores no es correcto.

public class ApiResponse { [JsonProperty(PropertyName = "status")] public string Status; [JsonProperty(PropertyName = "data")] public IEnumerable<KeyValuePair<string, string>> Data; [JsonProperty(PropertyName = "error")] public IEnumerable<KeyValuePair<int, string>> Errors; }; // this doesn''t throw a parsing exception, but the resulting // Data and Errors fields are not correctly populated. var x = JsonConvert.DeserializeObject<ApiResponse>(SampleJson);

Cualquier ayuda será apreciada, gracias.


Hay pocos problemas con la clase que ha creado. Según el proporcionar JSON, debería crear sus clases similares al código siguiente.

public class Data { [JsonProperty(PropertyName = "warning")] public string Warning { get; set; } } public class Error { [JsonProperty(PropertyName = "373")] public string Col_373 { get; set; } } public class ApiResponse { [JsonProperty(PropertyName = "status")] public string Status { get; set; } [JsonProperty(PropertyName = "data")] public List<Data> Data { get; set; } [JsonProperty(PropertyName = "error")] public List<Error> Error { get; set; } }

Una vez que haya diseñado la estructura de esta manera, siempre puede volver a la estructura de su objeto como el siguiente fragmento de código. Parece que te confunden los nombres y valores de las propiedades.

string json = "{/"status/":/"error/", /"data/": [{/"warning/" : /"your input was wrong/" }], /"error/": [{/"373/": /"Error description goes here/"}]}"; var res = JsonConvert.DeserializeObject<ApiResponse>(json);

Una observación más.

"373" : "La descripción del error va aquí"

Por favor, no use el número como la clave / nombre de la columna.


Intente definir sus miembros de Data y Errors como IEnumerables of Dictionaries en lugar de IEnumerables of KeyValuePairs. (Json.Net espera que KeyValuePairs se represente en JSON como objetos con propiedades explícitas de Key y Value , que no es lo que tiene allí).

public class ApiResponse { [JsonProperty(PropertyName = "status")] public string Status; [JsonProperty(PropertyName = "data")] public IEnumerable<Dictionary<string, string>> Data; [JsonProperty(PropertyName = "error")] public IEnumerable<Dictionary<int, string>> Errors; };

Luego puede leer los datos usando un bucle foreach con SelectMany :

var x = JsonConvert.DeserializeObject<ApiResponse>(SampleJson); foreach (var kvp in x.Data.SelectMany(d => d)) { Console.WriteLine(kvp.Key + ": " + kvp.Value); } foreach (var kvp in x.Errors.SelectMany(d => d)) { Console.WriteLine(kvp.Key + ": " + kvp.Value); }

Fiddle: https://dotnetfiddle.net/KJuAPu