我有以下由第三方交付的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`2System.String,Models.ObjectTypes+Object‘,因为该类型需要一个JSON对象(例如{“名称”:“值”})才能正确反序列化。要修复此错误,要么将JSON更改为JSON对象(例如,{"name":"value"}),要么将反序列化类型更改为数组,或者将实现集合接口(例如ICollection、IList)的类型改为可以从JSON数组反序列化的列表。还可以将JsonArrayAttribute添加到该类型中,以强制它从JSON数组中反序列化。路径'data.objects',第1行,位置20。
对于如何解决这个问题,有什么建议吗?
发布于 2018-10-16 12:42:05
您应该对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; }
}
发布于 2018-10-16 13:30:51
正如我在评论中提到的,json结构在两个字符串中都不匹配。objects
可以是对象(字典),也可以是数组。
我已经创建了一个小的解析器类,它将解析json并检查objects
是对象(字典)还是数组。在第一种情况下,它将返回一个空的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);
https://stackoverflow.com/questions/52835302
复制相似问题