c# json serialization json.net

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); }