Json.NET需要反序列化的所有属性

Kas*_*man 16 json json.net

在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)

笔记: