在Json.NET中,如何在反序列化时使所有属性成为必需?我知道我可以使用消息上的属性来执行此操作,但我不想这样做.主要是因为它需要我的消息库来承担外部依赖.
我尝试了MissingMemberHandling.Error设置,但它与我想要的完全相反.我对JSON有额外的属性没关系.我希望它在JSON中缺少任何目标对象属性时失败.
我实际上反序列化为F#记录,无论如何,属性通常不能为null.(它们不能通过代码中的常规方式赋值为null.)但是当数据丢失时,Json.NET很乐意将属性默认为null.
接受答案的F#版本
分解器
open System
open Newtonsoft.Json
open Newtonsoft.Json.Serialization
type RequireAllPropertiesContractResolver() =
inherit DefaultContractResolver()
override me.CreateObjectContract(objectType:Type) =
let contract = base.CreateObjectContract(objectType)
contract.ItemRequired <- new Nullable<Required>(Required.Always)
contract
Run Code Online (Sandbox Code Playgroud)
在设置中
let settings = new JsonSerializerSettings() // default settings
...
settings.ContractResolver <- new RequireAllPropertiesContractResolver()
Run Code Online (Sandbox Code Playgroud)
dbc*_*dbc 27
将属性添加[JsonObject(ItemRequired=Required.Always)]到您的类:
类型:必填
一个值,指示是否需要对象的属性.
可能的值Required是:
- 默认值:该属性不是必需的.默认状态.
- AllowNull:该属性必须以JSON定义,但可以为空值.
- 始终:该属性必须以JSON定义,并且不能为空值.
- DisallowNull:该属性不是必需的,但它不能为空值[如果存在].(Json.NET 8.0.1及更高版本.)
该设置是继承的,因此可以添加到通用基类中.
更新
要对所有对象进行全局操作DefaultContractResolver,请将其子类化并将ItemRequired标志添加到所有对象协定:
public class RequireObjectPropertiesContractResolver : DefaultContractResolver
{
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
var contract = base.CreateObjectContract(objectType);
contract.ItemRequired = Required.Always;
return contract;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在设置中:
var settings = new JsonSerializerSettings { ContractResolver = new RequireObjectPropertiesContractResolver() };
Run Code Online (Sandbox Code Playgroud)
笔记:
如果您不希望在f#成员optional看到此问题的答案时需要JSON属性,并且还要根据属性类型查询Json.NET make属性所需的问题.
您可能希望缓存合同解析程序以获得最佳性能.
| 归档时间: |
|
| 查看次数: |
5161 次 |
| 最近记录: |