自定义JSON反序列化器,用于格式错误的JSON

时间:2018-06-01 07:47:14

标签: c# json

我正在尝试反序列化一些格式不正确的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以满足我的需求。

1 个答案:

答案 0 :(得分:3)

按优先顺序排列,以下是解决此问题的方法:

  1. 尝试更改输出,这意味着构建此json的人应该决定是否要返回数组或字典,而不是两者都
  2. 使用自定义反序列化程序
  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; }