【问题标题】:Getting "because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly" error when deserializing a Json object反序列化 Json 对象时出现“因为类型需要 JSON 数组(例如 [1,2,3])才能正确反序列化”错误
【发布时间】:2016-01-30 09:11:01
【问题描述】:

请帮助我。我在哪里缺少信息? 我需要反序列化以下 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,2,3])或将反序列化类型更改为可以从 JSON 对象反序列化的普通 .NET 类型(例如,不是整数之类的原始类型,不是数组或 List 之类的集合类型)。也可以将 JsonObjectAttribute 添加到该类型以强制其反序列化一个 JSON 对象。\r\n路径“结果”,第 2 行,位置 12。"}

【问题讨论】:

    标签: c# json serialization json.net


    【解决方案1】:

    您收到此错误是因为您的 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);
    

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

    【讨论】:

    • 非常感谢,我正在为分层 JSON 苦苦挣扎,示例非常适合我!
    • 虽然我的具体情况与这个问题不同,但这个答案确切地告诉了我我需要弄清楚如何在 C# 中修复我自己的 JSON 对象所需的信息 - 谢谢!
    【解决方案2】:

    如果您愿意牺牲 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      相关资源
      最近更新 更多