在json.net中由于反序列化而错误的类型时忽略属性

时间:2014-07-16 08:35:14

标签: c# json json.net

在我的c#app中,我使用json.net库来处理jsons。
我有情况:

属性:

[JsonProperty("my_test_property_json_key", NullValueHandling = NullValueHandling.Ignore)]
public int[] MyTestProperty{ get; set; }

当我的这个专业的json看起来像:

[0,1,2,3,4,5] 

一切都很棒。 但是当我有错误的json值时可能出现这样的情况:

[[0,1,2,3]]

在这种情况下,我得到了例外:

[Newtonsoft.Json.JsonReaderException] = {"Error reading integer. Unexpected token: StartArray. Path 'my_test_property_json_key[0]', line 1, position 3250."}

在这种情况下的正确行为应该是:
返回空int[]

当我有错误的json(属性存在,但它是一个不同的类型)时,我怎么能忽略这个属性?

注意:我的json太大了(很多其他属性) - 我不能用默认数据重新创建它(我不能丢失数据)。

1 个答案:

答案 0 :(得分:2)

您可以创建一个尝试读取整数数组的自定义转换器,如果数据不正确,则返回一个空数组:

class MyCustomInt32ArrayConverter : JsonConverter
{
    public override object ReadJson(
        JsonReader reader,
        Type objectType,
        Object existingValue,
        JsonSerializer serializer)
    {
        var array = serializer.Deserialize(reader) as JArray;
        if (array != null)
        {
            return array.Where(token => token.Type == JTokenType.Integer)
                        .Select(token => token.Value<int>())
                        .ToArray();
        }
        return new int[0];
    }

    public override void WriteJson(
        JsonWriter writer,
        Object value,
        JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(int[]);
    }
}

只需使用JsonConverterAttribute属性将转换器应用于属性:

[JsonConverterAttribute(typeof(MyCustomInt32ArrayConverter))]
[JsonProperty("my_test_property_json_key", NullValueHandling = NullValueHandling.Ignore)]
public int[] MyTestProperty{ get; set; }