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

前端之家收集整理的这篇文章主要介绍了Json.NET需要反序列化的所有属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Json.NET中,如何在反序列化时使所有属性成为必需?我知道我可以使用消息上的属性来执行此操作,但我不想这样做.主要是因为它需要我的消息库来承担外部依赖.

我尝试了MissingMemberHandling.Error设置,但它与我想要的相反.我对JSON有额外的属性没关系.我希望它在JSON中缺少任何目标对象属性时失败.

我实际上反序列化为F#记录,无论如何,属性通常不能为null. (它们不能通过代码中的常规方式赋值为null.)但是当数据丢失时,Json.NET很乐意将属性默认为null.

接受答案的F#版本

分解器

  1. open System
  2. open Newtonsoft.Json
  3. open Newtonsoft.Json.Serialization
  4.  
  5. type RequireAllPropertiesContractResolver() =
  6. inherit DefaultContractResolver()
  7.  
  8. override me.CreateObjectContract(objectType:Type) =
  9. let contract = base.CreateObjectContract(objectType)
  10. contract.Itemrequired <- new Nullable<required>(required.Always)
  11. contract

在设置中

  1. let settings = new JsonSerializerSettings() // default settings
  2. ...
  3. settings.ContractResolver <- new RequireAllPropertiesContractResolver()
属性 [JsonObject(ItemRequired=Required.Always)]添加到您的类:

Type: 07001

A value indicating whether the object’s properties are required.

required的可能值为:

  • Default: The property is not required. The default state.
  • AllowNull: The property must be defined in JSON but can be a null value.
  • Always: The property must be defined in JSON and cannot be a null value.

该设置是继承的,因此可以添加到通用基类中.

更新

要对所有对象进行全局操作,请将DefaultContractResolver子类化,并将Itemrequired标志添加到所有对象协定:

  1. public class RequireObjectPropertiesContractResolver : DefaultContractResolver
  2. {
  3. protected override JsonObjectContract CreateObjectContract(Type objectType)
  4. {
  5. var contract = base.CreateObjectContract(objectType);
  6. contract.Itemrequired = required.Always;
  7. return contract;
  8. }
  9. }

然后,在设置中:

  1. var settings = new JsonSerializerSettings { ContractResolver = new RequireObjectPropertiesContractResolver() };

猜你在找的Json相关文章