如果存在未知属性,则Json.NET会反序列化失败,但是如果缺少已知属性,则不会失败

时间:2018-12-06 17:19:00

标签: c# json json.net

我有一个课程想反序列化为使用Json.NET

public class Settings {
    public MoreSettings More { get; set; }
}

public class MoreSettings {
    public int Value { get; set; }
}

我希望以下没有未知属性的示例成功反序列化。

1.1

{}

1.2

{
    "MoreSettings": null
}

1.3

{
    "MoreSettings": {
    }
}

1.4

{
    "MoreSettings": {
        "Value": 42
    }
}

我希望以下具有未知属性的示例反序列化失败。

2.1

{
    "MoreSetting": null
}

2.2

{
    "MoreSettings": {
        "Values": 42
    }
}

我不认为我可以使用MissingMemberHandling,因为它会因缺少值而失败。我只想在未知值上失败。替代品?

1 个答案:

答案 0 :(得分:0)

您可以将JsonSerializerSettings.MissingMemberHandling设置为MissingMemberHandling.Error来引发错误,该错误是在json中找到的,但在模型中找不到。您甚至可以向JsonSerializerSettings.Error添加处理程序以拦截错误。

public static void InitializeJsonSerializer()
{
    JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
    {
        MissingMemberHandling = MissingMemberHandling.Error,
        Error = ErrorHandler,
    };

    void ErrorHandler(object sender, Newtonsoft.Json.Serialization.ErrorEventArgs e)
    {
        if (e.ErrorContext.Error.Message.StartsWith("Could not find member "))
        {
            // do something...

            // hide the error
            e.ErrorContext.Handled = true;
        }
    }
}