如何为具有无效值的属性使用 JSON.net 的默认值

ash*_*pma 5 c# json json.net

我正在使用 Newtonsoft JSON 库来反序列化来自 Web 服务的响应。问题是某些字段包含无效的值。例如,一条记录上的一个字段包含一个“T”,表示一个应该是数字的字段。我想要做的是将无效字段的值设置为 null 或其他一些默认值。我的所有属性都被定义为可为空的,所以如果它们默认为空就可以了。

有没有办法做到这一点?我曾尝试创建自定义 JsonConverters,但我宁愿不必为每种类型定义 JsonConverter。如果可能,我希望对于所有字段,如果该属性的值无效(例如数字类型的“T”),则将它们设置为 null。

我已经查看了 OnError 事件处理程序,但这似乎丢弃了整个错误记录。我不想丢弃任何记录。我只想让无效属性的值为空。

这可能吗?我已经寻找了很多答案,但我没有找到另一个试图这样做的问题,但是如果我忽略了一个现有的问题,请告诉我。

感谢您的帮助。

dbc*_*dbc 3

您可以创建一个JsonConverterfor all nullable 类型,尝试在非 null 时将相应的 JSON 值反序列化为基础类型,并在失败时返回 null:

public class NullableTypeConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return Nullable.GetUnderlyingType(objectType) != null;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return null;
        var underlyingType = Nullable.GetUnderlyingType(objectType);
        if (underlyingType == null)
            throw new JsonSerializationException("Invalid type " + objectType.ToString());
        var token = JToken.Load(reader);
        try
        {
            return token.ToObject(underlyingType, serializer);
        }
        catch (Exception ex)
        {
            // Log the exception somehow
            Debug.WriteLine(ex);
            return null;
        }
    }

    public override bool CanWrite { get { return false; } }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在反序列化您的类时使用它。

var settings = new JsonSerializerSettings { Converters = new[] { new NullableTypeConverter() } };
Run Code Online (Sandbox Code Playgroud)

JToken.Load()如果 JSON 本身格式错误且无法读取,转换器仍会抛出异常(从调用)。仅当 JSON 值在加载后无法转换为适当的类型时,它才会吞掉异常。