首页 > 解决方案 > 当 JSON 中缺少属性且不可为空时,如何抛出 JsonSerializationException?

问题描述

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

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

JsonSerializerSettings settings = new JsonSerializerSettings();
MyParameters parms = JsonConvert.DeserializeObject<MyParameters>(json, settings);

例子:

public class MyParameters
{
    public string Message1 { get; set; }
    public string Message2 { get; set; }
    public int MyInt { get; set; }
    public int? MyNullableInt { get; set; }
}

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

{
    "Message1": "A message",
    "MyInt ": 1
}

结果:

Message1 = "A message"
Message2 = null
MyInt = 1
MyNullableInt = null

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

{
    "Message1": "A message",
    "MyNullableInt": 1
}

标签: c#json.net

解决方案


您可以使用自定义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;
    }
}

当您反序列化时,将解析器应用于您的JsonSerializerSettings此类:

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new NonNullablePropertiesRequiredResolver();
MyParameters parms = JsonConvert.DeserializeObject<MyParameters>(json, settings);

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


推荐阅读