为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
温温酱 2023-09-24 15:59:09
当反序列化缺少属性的 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 = nullMyInt = 1MyNullableInt = null但以下 JSON 应该会导致异常,因为MyInt缺少:{    "Message1": "A message",    "MyNullableInt": 1}
查看完整描述

1 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

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


查看完整回答
反对 回复 2023-09-24
  • 1 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信