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

当反序列化缺少属性的 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

}


温温酱
浏览 85回答 1
1回答

神不在的星期二

您可以使用自定义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
打开App,查看更多内容
随时随地看视频慕课网APP