当反序列化缺少属性的 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)
您可以使用自定义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
| 归档时间: |
|
| 查看次数: |
870 次 |
| 最近记录: |