gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:40:41 26 4
gpt4 key购买 nike

在 Json.NET 中,如何制作反序列化所需的所有属性?我知道我可以使用消息的属性来做到这一点,但我不想那样做。主要是因为它需要我的消息库承担外部依赖。

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

我实际上是反序列化为 F# 记录,无论如何,属性通常不能为空。 (在代码中不能通过正常方式将它们分配为 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)] 到你的类(class):

Type: Required

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.
  • DisallowNull: The property is not required but it cannot be a null value [if present]. (Json.NET 8.0.1 and later.)

该设置是继承的,因此可以添加到通用基类中。
更新
要对所有对象全局执行此操作,请将 DefaultContractResolver 子类化并添加 ItemRequired标记所有对象契约(Contract):
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() };
笔记:
  • 如果您不想在 f# 成员为 optional 时要求 JSON 属性见 this answer对这个问题以及问题 Json.NET make property required based on property type .
  • 此合约解析器应用默认设置 Required.Always到所有对象属性,但不会覆盖 JsonProperty.AttributeRequired 直接申请的时候。如果您需要,请参阅例如How to override the "Required.Always" in newtonsoft json .
  • 如问题所述,设置 MissingMemberHandling = MissingMemberHandling.Error 解决了一个免费问题:如果您的 JSON 可能具有您的 的属性型号 省略,并且您希望这是一个错误,请使用 MissingMemberHandling.Error .见:MissingMemberHandling setting .
  • 您可能想要 cache the contract resolver for best performance .
  • 关于Json.NET 需要反序列化的所有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29655502/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com