我有第三方提供的以下JSON格式:
{
"data": {
"objects": {
"0ea73fa9333a7cbeb2d8c69a14b9970f": {
"Id": "0ea73fa9333a7cbeb2d8c69a14b9970f",
"Name": "test"
},
"38b1390ff6bc8a9837105d181000bcc8": {
"Id": "38b1390ff6bc8a9837105d181000bcc8",
"Name": "test"
}
}
}}
我正在使用此模型反序列化:
public class ObjectTypes
{
public ObjectTypeList data { get; set; }
public class ObjectTypeList
{
public Dictionary<string, Object> objects { get; set; }
}
public class Object
{
public string Id { get; set; }
public string Name { get; set; }
}
}
这很好用,但是有时JSON是空的,
{
"data": {
"objects": []
}
}
导致此异常的原因:
无法将当前JSON数组(例如[1,2,3])反序列化为类型'System.Collections.Generic.Dictionary`2 [System.String,Models.ObjectTypes + Object]',因为该类型需要JSON对象(例如{“ name”:“ value”})正确反序列化。 要解决此错误,可以将JSON更改为JSON对象(例如{“ name”:“ value”}),也可以将反序列化类型更改为数组,或者将实现集合接口的类型(例如ICollection,IList)更改为List,例如List从JSON数组反序列化。还可以将JsonArrayAttribute添加到类型中,以强制其从JSON数组反序列化。 路径“ data.objects”,第1行,位置20。
关于如何解决此问题的任何建议?
答案 0 :(得分:0)
您应反序列化 ObjectTypes
类型 public partial class ObjectTypes
{
[JsonProperty("data")]
public Data Data { get; set; }
}
public partial class Data
{
[JsonProperty("objects")]
public Dictionary<string, Object> Objects { get; set; }
}
public partial class Object
{
[JsonProperty("Id")]
public string Id { get; set; }
[JsonProperty("Name")]
public string Name { get; set; }
}
答案 1 :(得分:0)
正如我在评论中已经提到的,json结构在两个字符串中都不匹配。 objects
可以是对象(词典)或数组。
我创建了一个小的解析器类,用于解析json并检查objects
是 object (词典)还是数组。在第一种情况下,它将返回一个空的ObjectTypes
对象,但是在第二种情况下,它将将json字符串反序列化为一个ObjectTypes
对象。
public class ObjectTypesParser
{
public ObjectTypes Parse(string json)
{
JToken token = JToken.Parse(json);
var objectsToken = token.First.First.First.FirstOrDefault();
if (objectsToken is JArray)
{
/*
Special case - json with an empty array:
{
""data"": {
""objects"": []
}
}
*/
return new ObjectTypes();
}
// json containing a dictionary:
ObjectTypes data = JsonConvert.DeserializeObject<ObjectTypes>(json);
return data;
}
}
C#类:
public class ObjectTypes
{
[JsonProperty("data")]
public ObjectTypeList Data { get; set; }
public ObjectTypes()
{
Data = new ObjectTypeList();
}
}
public class ObjectTypeList
{
[JsonProperty("objects")]
public Dictionary<string, ObjectData> Objects { get; set; }
public ObjectTypeList()
{
Objects = new Dictionary<string, ObjectData>();
}
}
public class ObjectData
{
[JsonProperty("Id")]
public string Id { get; set; }
[JsonProperty("Name")]
public string Name { get; set; }
}
使用代码:
string json1 = @"{
""data"": {
""objects"": {
""0ea73fa9333a7cbeb2d8c69a14b9970f"": {
""Id"": ""0ea73fa9333a7cbeb2d8c69a14b9970f"",
""Name"": ""test""
},
""38b1390ff6bc8a9837105d181000bcc8"": {
""Id"": ""38b1390ff6bc8a9837105d181000bcc8"",
""Name"": ""test""
}
}
}}";
string json2 = @"{
""data"": {
""objects"": []
}
}";
var parser = new ObjectTypesParser();
ObjectTypes data1 = parser.Parse(json1);
ObjectTypes data2 = parser.Parse(json2);