我正在尝试反序列化一些格式不正确的JSON。当结果数据存在时,我将其格式化为:
[
{
"jsonrpc": "2.0",
"result": {
"17449": {
"data": {
"id": "17449",
"type_title": "Relation"
},
"children": false
},
"17451": {
"data": {
"id": "17451",
"type_title": "Relation"
},
"children": false
},
"19059": {
"data": {
"id": "19059",
"type_title": "Relation"
},
"children": false
}
},
"error": null,
"id": 5
}
]
如果没有结果数据,我会得到:
[
{
"jsonrpc": "2.0",
"result": [],
"error": null,
"id": 5
}
]
因此,当我获取数据时,我可以将其解析为Dictionary<string,dataObject>
,但是当我得到一个空数组时,Jsson反序列化器会抛出异常,尝试将空数组反序列化为字典。
我知道我需要覆盖ReadJson方法,但是我不确定如何识别空数组以及如果找到它会返回什么。
这是我在的地方:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
object retVal = new Object();
if (reader.TokenType == JsonToken.StartArray)
{
#Somehow identify an empty array and return the right object (an empty Dictionary)
}
else
{
retVal = serializer.Deserialize(reader, objectType);
}
return retVal;
}
我可以使用一些帮助来完成ReadJson以满足我的需求。
答案 0 :(得分:3)
按优先顺序排列,以下是解决此问题的方法:
这是自定义反序列化器,请注意,当它检测到数组时,它只是假设此数组为空,它不会以任何方式尝试反序列化数组的内容。
public class DictionaryOrEmptyArray : JsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Array)
return new Dictionary<string, dataObject>();
return token.ToObject<Dictionary<string, dataObject>>();
}
public override bool CanConvert(Type objectType) => objectType == typeof(Dictionary<string, dataObject>);
public override bool CanWrite => false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException();
}
您可以将此附加到您的财产:
[JsonConverter(typeof(DictionaryOrEmptyArray))]
public Dictionary<string, dataObject> Result { get; set; }