在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
在设置中
let settings = new JsonSerializerSettings() // default settings
...
settings.ContractResolver <- new RequireAllPropertiesContractResolver()
如果您的 模型 具有 JSON
可能会忽略的属性,而您希望它是一个错误,请将属性添加[JsonObject(ItemRequired=Required.Always)]
到类中:
类型:必填
一个值,指示是否需要对象的属性。
可能的值为Required
:
- 默认值:该属性不是必需的。默认状态。
- AllowNull:该属性必须在JSON中定义,但可以为空值。
- 始终:该属性必须在JSON中定义,并且不能为空值。
- DisallowNull:该属性不是必需的,但不能为null值(如果存在)。(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;
}
}
然后,在设置中:
var settings = new JsonSerializerSettings { ContractResolver = new RequireObjectPropertiesContractResolver() };
笔记:
* 如问题中所述,该设置MissingMemberHandling = MissingMemberHandling.Error
解决了一个补充问题:如果您的 JSON 可能具有您的 模型 忽略的属性,并且您希望它是一个错误,请使用MissingMemberHandling.Error
。请参阅:MissingMemberHandling设置。
问题内容: 我如何才能序列化一个特定的属性,但又防止其反序列化回POCO?是否可以使用属性装饰特定属性? 基本上,我正在寻找一个与ShouldSerialize *方法等效的反序列化方法。 我知道我可以编写一个自定义转换器,但是这样做似乎有点过头了。 编辑: 这里还有一些背景。这背后的原因是我的课看起来像: 我需要请求的属性,但是我不希望它反序列化并触发设置程序逻辑。 问题答案: 最简单的方法是将
考虑: 如果我们序列化Foo(),输出是: 我想要: 最干净的方法是什么?
Json.net有没有办法只指定你想要序列化的属性?或者根据绑定标志序列化某些属性,比如只声明? 现在我正在使用< code > JObject。FromObject(MainObj。SubObj);要获取SubObj的所有属性,SubObj是遵循ISubObject接口的类的实例: 如果是,它将序列化A和B,但如果是,它将仅序列化B和C并忽略父属性
问题内容: 将对象反序列化为()时,嵌套对象反序列化为s。是否可以强制将嵌套对象反序列化为s? 问题答案: 我找到了一种通过提供实现将所有嵌套对象转换为的方法: 文档: Json.NET的CustomCreationConverter
问题内容: 我正在反序列化使用的对象,该对象包含Guid类型的私有字段和该字段的公共属性。当我的json中的my的值为null时,我想分配给我的字段。 但是想要访问私有字段,导致在尝试反序列化时出现此错误: 将值{null}转换为类型’System.Guid’时出错。路径“ [0]。属性”,第6行,位置26。 如何使其忽略私有字段,而使用公共属性? 问题答案: Json.NET拒绝为a 设置值,因
问题内容: 我正在尝试对a进行序列化/反序列化,如果对象是简单类型,这似乎很好,但是当对象更复杂时,它不起作用。 我有这个课: 在我的字典中,我添加了一个带有“重定向链”键的键和一些带有“状态”,“网址”,“父网址”键的简单字符串。我从JSON.Net返回的字符串如下所示: 我用来序列化的代码如下: 反序列化我正在做的事情: 字典恢复正常,所有字符串恢复正常,但是列表未正确反序列化。它只是作为 当