Ignoring an invalid field when deserializing json in Json.Net

不问归期 提交于 2019-12-24 07:16:50

问题


I'm trying to deserialize some json from a 3rd party provider, and occasionally it returns some invalid date field (like -0001-01-01 or something). This causes the process to throw an exception.

Is there a way to tell Json.Net to ignore fields that are invalid?

Thanks

Matt


回答1:


To expand on the answer from David, I have used a custom DateTime converter:

public class SafeDateTimeConvertor : DateTimeConverterBase
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        DateTime result;
        if (DateTime.TryParse(reader.Value.ToString(), out result))
            return result;
        return existingValue;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(((DateTime)value).ToString("yyyy-MM-dd hh:mm:ss"));
    }
}

Which is then applied like this:

var result = JsonConvert.DeserializeObject<TestClass>(json, new SafeDateTimeConvertor());



回答2:


JSON.NET has numerous ways to control serialization. You might look at Conditional Property (De)Serialization for example.

There's an entire topic in the online docs on Serializing Dates.

You could write a custom converter; see the documentation for the Newtonsoft.Json.Converters namespace.




回答3:


It happens, third parties can neglect type safety in their JSON. I recommend you contact them. I had a scenario where a property was either a string array or "false". Json.NET didn't like this so as a temporary hack, I created this custom converter to ignore the deserialization exception:

public class IgnoreDataTypeConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        try { return JToken.Load(reader).ToObject(objectType); }
        catch { }
        return objectType.IsValueType ? Activator.CreateInstance(objectType) : null;
    }

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

This "TryConvert" approach is not advised. Use it as a temporary solution after you send your thoughts to the designers of the originating JSON you are consuming.



来源:https://stackoverflow.com/questions/29797965/ignoring-an-invalid-field-when-deserializing-json-in-json-net

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!