当 JSON 中缺少属性且不可为 null 时,如何抛出 JsonSerializationException?

Boo*_*mit 5 c# json.net

当反序列化缺少属性的 JSON 字符串时,我的类中的这些属性将使用其默认值进行填充。我想更改JsonSerializerSettings,以便如果 JSON 中缺少某个属性并且该属性在类中不可为空,则会引发异常。相反,当属性可为空时,则不需要它。

我知道属性是可能的,但我想要一个通用设置。

JsonSerializerSettings settings = new JsonSerializerSettings();
MyParameters parms = JsonConvert.DeserializeObject<MyParameters>(json, settings);
Run Code Online (Sandbox Code Playgroud)

例子:

public class MyParameters
{
    public string Message1 { get; set; }
    public string Message2 { get; set; }
    public int MyInt { get; set; }
    public int? MyNullableInt { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以下 JSON 应该是可反序列化的:

{
    "Message1": "A message",
    "MyInt ": 1
}
Run Code Online (Sandbox Code Playgroud)

结果:

Message1 = "A message"
Message2 = null
MyInt = 1
MyNullableInt = null
Run Code Online (Sandbox Code Playgroud)

但以下 JSON 应该会导致异常,因为MyInt缺少:

{
    "Message1": "A message",
    "MyNullableInt": 1
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ers 2

您可以使用自定义ContractResolver来执行您想要的操作:

class NonNullablePropertiesRequiredResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty prop = base.CreateProperty(member, memberSerialization);
        Type propType = prop.PropertyType;
        if (propType.IsValueType && !(propType.IsGenericType && propType.GetGenericTypeDefinition() == typeof(Nullable<>)))
        {
            prop.Required = Required.Always;
        }
        return prop;
    }
}
Run Code Online (Sandbox Code Playgroud)

反序列化时将解析器应用到您的应用程序中JsonSerializerSettings,如下所示:

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new NonNullablePropertiesRequiredResolver();
MyParameters parms = JsonConvert.DeserializeObject<MyParameters>(json, settings);
Run Code Online (Sandbox Code Playgroud)

工作演示: https: //dotnetfiddle.net/t56U2a