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