当前位置: 首页 > 面试题库 >

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

冀永寿
2023-03-14
问题内容

在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返回的字符串如下所示: 我用来序列化的代码如下: 反序列化我正在做的事情: 字典恢复正常,所有字符串恢复正常,但是列表未正确反序列化。它只是作为 当