反序列化Json c#检查是否列表

本文关键字:是否 列表 检查 Json 反序列化 | 更新日期: 2023-09-27 18:03:32

我用newtonsoft Json反序列化Json有问题。

我有一个类

[Serializable]
public class ValueAdd
{
    [JsonProperty(PropertyName = "@id")]
    public string Description { get; set; }
    [JsonProperty(PropertyName = "@description")]
    public string Id { get; set; }
}
[Serializable]
public class ValueAdds
{ 
    public List<ValueAdd> ValueAdd { get; set; }
    [JsonProperty(PropertyName = "@size")]
    public string Size { get; set; }
}

和API返回的格式的愚蠢的两件事:一个我可以序列化正确:

"ValueAdds":
{
   "@size": "3",
   "ValueAdd":
   [
    {
        "@id": "2103",
        "description": "some property"
    },
    {
        "@id": "2192",
        "description": "some property"
    },
    {
        "@id": "2196",
        "description": "some property"
    }
   ]
}

但是当它们返回一个属性时,它不会返回一个列表。只以这种方式返回:

"ValueAdds":
{
   "@size": "1",
   "ValueAdd":
    {
        "@id": "2103",
        "description": "some property"
    }
}

导致

解析器错误
JsonConvert.DeserializeObject<ValueAdds>(_response);

类型'Newtonsoft.Json '的第一次机会异常。JsonSerializationException'在Newtonsoft.Json.dll中发生

附加信息:无法将当前JSON对象(例如{"name":"value"})反序列化为类型'System.Collections.Generic '。列出' 1[myproperty]',因为该类型需要一个JSON数组(例如[1,2,3])来正确反序列化。

我的问题是,有办法解决它吗?我不能改变api响应,需要改变从我这边试图解析是否有一个列表。

反序列化Json c#检查是否列表

实际上,属性应该是数组或对象。你的回答应该一致。

无论如何,要解决这个问题,你应该将它绑定到动态或对象。

[Serializable]
public class ValueAdds
{ 
 public dynamic ValueAdd { get; set; }
 [JsonProperty(PropertyName = "@size")]
 public string Size { get; set; }
}

那么您应该检查ValueAdd类型

因为在你的ValueAds ValueAdd是列表,但在你的第二个json它是一个单一的实体,所以你不能分配它,你需要创建另一个模型

[Serializable]
public class ValueAdds2
{ 
    public ValueAdd ValueAdd { get; set; }
    [JsonProperty(PropertyName = "@size")]
    public string Size { get; set; }
}
然后

JsonConvert.DeserializeObject<ValueAdds2>(_response);