请帮帮我。我哪里缺少信息?我需要反序列化以下JSON字符串。
{"results":[{"series":[{"name":"PWR_00000555","columns":["time","last"],"values":[["1970-01-01T00:00:00Z",72]]}]}
为此,我定义了我的类:
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; }
但是当我尝试使用反序列化程序时,它会出现异常。
{"无法将当前JSON对象(例如{\"name \":\"value \"})反序列化为类型"System.Collections.Generic.List`1[InfluxDB.Serie]",因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。\r\n若要修复此错误,请将JSON更改为JSON数组(如[1,3,])或更改反序列化的类型,使其成为正常的.NET类型(例如,不是像integer这样的基元类型,也不是像数组或List<T>这样的集合类型),可以从JSON对象反序列化。JsonObjectAttribute也可以添加到类型中,以强制它从JSON对象反序列化。\\r\n路径"results",第2行,位置12。"}
您得到这个错误是因为您的JSON是分层的,而您的类基本上是平面的。如果您使用JSONLint.com来验证和重新格式化JSON,您可以更好地看到其结构:
{
"results": [
{
"series": [
{
"name": "PWR_00000555",
"columns": [
"time",
"last"
],
"values": [
[
"1970-01-01T00:00:00Z",
72
]
]
}
]
}
]
}
这对应于以下类结构(我最初使用json2csharp.com生成,然后手动编辑以添加[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; }
}
您可以将JSON反序列化为上面的类结构,如下所示:
var root = JsonConvert.DeserializeObject<RootObject>(jsonString);
Fiddle:https://dotnetfiddle.net/50Z64s
如果您愿意牺牲IntelliSense和编译时类型的安全性,那么您可以简单地将JSON反序列化为动态对象:
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);
}