反序列化 Json 对象时出现"because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly"错误



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

相关内容

  • 没有找到相关文章

最新更新