获取“因为类型需要JSON数组(例如[1,2,3])才能正确反序列化”反序列化Json对象时出错

时间:2015-10-30 01:44:41

标签: c# json serialization json.net

请帮帮我。我在哪里缺少信息? 我需要反序列化以下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位。“}

2 个答案:

答案 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; }
}

小提琴:https://dotnetfiddle.net/50Z64s

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