c# - Obteniendo "porque el tipo requiere una matriz JSON(por ejemplo[1,2,3]) para deserializar correctamente" error al deserializar un objeto Json
serialization json.net (2)
Por favor, ayúdame. ¿Dónde me falta información? Necesito deserializar la siguiente cadena JSON.
{"results": [{"series": [{"name": "PWR_00000555", "columns": ["time", "last"], "values": [["" 1970-01-01T00: 00: 00Z ", 72]]}]}]}
Para esto, he definido mi clase:
public class Serie
{
public Serie()
{
this.Points = new List<object[]>();
}
[JsonProperty(PropertyName = "results")]
public string results { get; set; }
[JsonProperty(PropertyName = "series")]
public string sries { get; set; }
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
[JsonProperty(PropertyName = "columns")]
public string[] ColumnNames { get; set; }
[JsonProperty(PropertyName = "values")]
public List<object[]> Points { get; set; }
Pero cuando intento usar el deserializador, da una excepción.
{"No se puede deserializar el objeto JSON actual (por ejemplo, {/" nombre / ": /" valor / "}) en el tipo ''System.Collections.Generic.List`1 [InfluxDB.Serie]'' porque el tipo requiere una matriz JSON ( ej. [1,2,3]) para deserializar correctamente. / r / nPara arreglar este error, cambie el JSON a un array JSON (ej. [1,2,3]) o cambie el tipo deserializado para que sea un normal. Tipo de NET (por ejemplo, no un tipo primitivo como entero, no un tipo de colección como una matriz o Lista <T>) que se puede deserializar de un objeto JSON. JsonObjectAttribute también se puede agregar al tipo para forzarlo a deserializar desde un objeto JSON . / r / nPath ''resultados'', línea 2, posición 12. "}
Obtiene este error porque su JSON es jerárquico, mientras que su clase es esencialmente plana. Si usa JSONLint.com para validar y formatear el JSON, puede ver mejor la estructura:
{
"results": [
{
"series": [
{
"name": "PWR_00000555",
"columns": [
"time",
"last"
],
"values": [
[
"1970-01-01T00:00:00Z",
72
]
]
}
]
}
]
}
Esto corresponde a la siguiente estructura de clase (que inicialmente generé usando json2csharp.com , luego edité manualmente para agregar los atributos [JsonProperty]
):
public class RootObject
{
[JsonProperty("results")]
public List<Result> Results { get; set; }
}
public class Result
{
[JsonProperty("series")]
public List<Series> Series { get; set; }
}
public class Series
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("columns")]
public List<string> ColumnNames { get; set; }
[JsonProperty("values")]
public List<List<object>> Points { get; set; }
}
Puede deserializar su JSON en la estructura de clase anterior de esta manera:
var root = JsonConvert.DeserializeObject<RootObject>(jsonString);
Fiddle: https://dotnetfiddle.net/50Z64s
Si está dispuesto a sacrificar IntelliSense y compilar seguridad de tipo de tiempo, entonces simplemente puede deserializar el JSON en un objeto dinámico:
dynamic parsed = JsonConvert.DeserializeObject(jsonString);
PrintAllNames(parsed);
//...
private void PrintAllNames(dynamic obj)
{
foreach(var result in obj.results)
foreach(var item in result.series)
Console.WriteLine(item.name);
}