反序列化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响应,需要改变从我这边试图解析是否有一个列表。
实际上,属性应该是数组或对象。你的回答应该一致。
无论如何,要解决这个问题,你应该将它绑定到动态或对象。
[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);