请帮帮我。我在哪里缺少信息? 我需要反序列化以下JSON字符串。
{ “结果”:[{ “串联”:[{ “名称”: “PWR_00000555”, “列”:[ “时间”, “最后”], “值”:[[“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,2,3]),要么更改反序列化类型以便它是一个普通的.NET类型(例如,不是像整数这样的基本类型,不是像数组或List&lt; T&gt;那样的集合类型),可以从JSON对象反序列化.JsonObjectAttribute也可以添加到类型中以强制它从反序列化一个JSON对象。\ r \ n路径'结果',第2行,第12位。“}
答案 0 :(得分:12)
您收到此错误是因为您的JSON是分层的,而您的类基本上是平的。如果您使用JSONLint.com来验证和重新格式化JSON,您可以更好地查看结构:
Fatal error: Call to a member function fetch_assoc() on a non-object in /path/to/index.php on line 8
这对应于以下类结构(我最初使用json2csharp.com生成,然后手动编辑以添加{
"results": [
{
"series": [
{
"name": "PWR_00000555",
"columns": [
"time",
"last"
],
"values": [
[
"1970-01-01T00:00:00Z",
72
]
]
}
]
}
]
}
属性):
[JsonProperty]
您可以将JSON反序列化为上述类结构,如下所示:
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; }
}
答案 1 :(得分:4)
如果您愿意牺牲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);
}