c# - 当 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
}
解决方案
您可以使用自定义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);
推荐阅读
- android - 如何使用改造 2 检索 json 多层数据
- python - 操作数不能与形状一起广播 (100,2) (100,100)
- insert - 在记事本++中处于覆盖模式时排除空白覆盖
- android - 为 Android 谷歌地图启用 AndroidX
- android - GradleException:已经为多模块共享版本创建了 Android 任务
- javascript - 设置后如何从firebase获得响应?
- php - 严格运算符在 PHP 7.3 中必不可少,但在 PHP 7.2 中不是
- django - 摆脱 URL 中的端口以在生产中安装 django
- keycloak - Keycloak Admin REST-API 同步联合映射器
- javascript - 监听来自 Svelte 组件的调度事件