Json.NET 根据属性类型设置属性为必填项

2023-12-12

我正在努力处理 .Net core 中的自定义 json 序列化,我试图默认设置所需的所有属性,除非属性具有特定类型。这是我想要实现的目标的示例:

假设我有以下类型: F#:

type FooType = {
   id: int
   name: string 
   optional: int option 
}

您可以将以下代码视为类似于 C# 中的以下代码:

class FooType =
{
   int Id {get;set;};
   string Name {get;set;};
   Nullable<int> Optional {get;set;};
}

我想做的是,如果 json 对象中缺少 Id 或 Name 属性,则返回错误,但如果缺少Optional,则反序列化不会出现错误(因此基本上是根据需要或不根据其类型设置属性)。我可以使用以下方法根据需要标记所有属性RequireObjectPropertiesContractResolver从这个样本:https://stackoverflow.com/a/29660550但不幸的是我无法构建更有活力的东西。

我还有可选类型的默认转换器,我想添加到序列化中。这不是这个特定问题的一部分,但如果您知道如何将属性标记为必需或不需要,并在一个地方使用自定义转换器,那么它会更好。


您可以组合合同解析器Json.NET 需要反序列化的所有属性答案的逻辑反思以确定财产是否属于期权类型 by p.s.w.g根据需要标记除可选成员之外的所有成员:

type RequireObjectPropertiesContractResolver() =
    inherit DefaultContractResolver()

    override __.CreateObjectContract(objectType: Type) = 
        let contract = base.CreateObjectContract objectType
        contract.ItemRequired <- System.Nullable<Required>(Required.Always)
        contract

    override __.CreateProperty(memberInfo: MemberInfo, memberSerialization: MemberSerialization) =
        let property = base.CreateProperty(memberInfo, memberSerialization)
        // https://stackoverflow.com/questions/20696262/reflection-to-find-out-if-property-is-of-option-type
        let isOption = property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() = typedefof<Option<_>>
        if isOption then (
            property.Required <- Required.Default        
            property.NullValueHandling <- new System.Nullable<NullValueHandling>(NullValueHandling.Ignore)
        )
        property

然后,反序列化如下:

let settings = new JsonSerializerSettings(ContractResolver = RequireObjectPropertiesContractResolver())
let obj = JsonConvert.DeserializeObject<FooType>(inputJson, settings)

Notes:

  • 我还添加了NullValueHandling.Ignore这样没有值的可选成员就不会被序列化。

  • 你可能想要缓存合约解析器以获得最佳性能.

  • Option<'T>不等于Nullable<'T>。我检查了typedefof<Option<_>>但你可以添加一个检查typedefof<System.Nullable<_>>如果你想要的话:

    let isOption = property.PropertyType.IsGenericType && (property.PropertyType.GetGenericTypeDefinition() = typedefof<Option<_>> || property.PropertyType.GetGenericTypeDefinition() = typedefof<System.Nullable<_>>)
    

Sample fiddle,这表明字符串{"id":101,"name":"John"}可以反序列化,但是字符串{"id":101} cannot.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Json.NET 根据属性类型设置属性为必填项 的相关文章

随机推荐

  • 计算文件中每一列的平均值

    我有一个包含 n 行 以逗号分隔 和列的文本文件 我想找到每列的平均值 不包括空字段 示例输入如下所示 1 2 3 4 6 7 期望的输出是 2 5 4 5 4 5 我尝试过 awk F for i 1 i lt NF i sum i su
  • C# - 将对象保存到 JSON 文件

    我正在编写一个 Windows Phone Silverlight 应用程序 我想将对象保存到 JSON 文件 我写了下面的代码 string jsonFile JsonConvert SerializeObject usr Isolate
  • 使用批处理运行带有参数的exe

    如何将参数传递到运行 exe 的批处理文件中 我有一个需要 2 个参数的程序 我想使用具有定义参数的 bat 文件运行它 5 五次 像这样的东西 FOR L G IN 1 1 5 DO start path program exe 20 1
  • 为什么 gcc 和 clang 为 std::find 生成这么多代码?

    我在 godbolt org 中输入以下代码 并使用 gcc 10 1 和 clang 10 编译它 include
  • 按键表达式存储静态过滤器

    我有一个函数 当传入一个时 它会生成一个表达式来通过主键过滤表Object 这非常类似于Find函数 只是它没有实现 所以你可以传递一个IQueryable之后周围 public static Expression
  • 使用标头过滤代理响应标头

    我有一个上游服务器 它经常通过返回 Set Cookie 响应标头来设置 Cookie 我想在上游服务器前面有一个 nginx 代理 Browser gt Nginx gt Upstream If the Browser gt Nginx请
  • 引用如何绑定到纯右值?

    cppreference 说 当引用绑定到纯右值时 会创建一个临时对象 它们是指 const 左值引用和右值引用吗 当纯右值具体化时 会创建临时对象 以便将其用作左值 这会在以下情况下发生 C 17 起 将引用绑定到纯右值 如果他们的意思是
  • 使部分(但不是全部)(CUDA) 内存访问不被缓存

    我只是注意到 CUDA 内核 内存访问完全有可能不被缓存 参见例如这个答案在这里 这可以吗 对于单个内核 在运行时而不是在编译时 仅用于写入而不是读取和写入 仅当您单独编译该内核时 因为这是通过代码生成启用的指令级功能 您还可以使用内联 P
  • Python3使用字典替换

    谁能解释一下这里出了什么问题 def get complementary sequence string dic A T C G T A G C for a b in dic items string string replace a b
  • 如何读取 log4j 输出到网页?

    我有一个网页 用于管理目的 它运行一个任务 从远程站点获取图像 为了能够仅使用浏览器而不是 ssh 等来调试任务 我希望能够读取执行线程的所有日志输出并将其吐出到网页 任务归结为 在调用开始时更改当前线程的日志级别 并在调用完成时恢复 读取
  • Hibernate 遇到 mysql := 运算符时出现异常

    当我执行以下代码时 出现异常 Exception org springframework orm hibernate3 HibernateQueryException Not all named parameters have been s
  • 如何在文本框中显示字符串数组

    您好 我是 C 新手 我的第一个 Windows 窗体应用程序遇到问题 我有来自串行端口的数据 并找到了一种处理数据并将其存储到 3 个不同字符串数组中的方法 我无法解决的是如何将数组中的数据显示到它们自己的单独文本框中 我只想显示当前索引
  • 使用实体框架(.edmx 模型)和 Razor 视图创建 MVC3 下拉列表&& 将数据库记录插入多个表

    在阅读了 100 篇有关如何使用 Razor 视图在 MVC 3 中创建下拉列表的文章后 我找不到适合我的情况的文章 情况 我最终试图创建一个视图来将员工添加到数据库中 这是我正在使用的 EDMX 模型的图像 create 将使用的表 目标
  • 如何在多行上打印数组列表?

    我正在学习 MOOC java 课程 并且我被困在练习 76 上 每当我提交答案时 它都会告诉我将每顿饭打印到单独的行 我该怎么做呢 主班 public class Main public static void main String a
  • 是否可以将请求标头添加到 iframe src 请求中?

    据我所知 在 JavaScript 中进行 AJAX 调用时 您可以非常轻松地设置 HTTP 请求标头 但是 通过脚本将 iframe 插入页面时是否也可以设置自定义 HTTP 请求标头 您可以在 JavaScript 中发出请求 设置您想
  • Java InetSocketAddress 类似于 .toString()?

    我正在 InetSocketAddress 上执行 toString 这是 Android websocket 客户端的一部分 迄今为止无法连接到主机 现在变量 address toString 的输出看起来像domain com 72 x
  • 在 POI 中添加带有 quotePrefix 的单元格

    我想在 xlsx 工作簿工作表中添加一个包含引号前缀的单元格 并且我正在尝试使用 POI 库创建该工作表 如何添加这种类型的单元格 我在 Maven Central 上找到了 CTXf setQuotePrefix boolean quot
  • php中匿名接口的实现

    在Java中我们可以这样做 interface Inter public void run class Test public Test Inter inter inter run new Test new Inter Override p
  • Clang 的 LTO 能否跨 C 和 C++ 方法进行优化 [重复]

    这个问题在这里已经有答案了 如果链接时优化 LTO 与clang 代码是否可以跨 C 和 C 语言边界进行优化 例如 C 函数可以内联到 C 调用程序中 反之亦然吗 AFAIK 是的 因为 Clang 生成 LLVM 中间表示 并且 LTO
  • Json.NET 根据属性类型设置属性为必填项

    我正在努力处理 Net core 中的自定义 json 序列化 我试图默认设置所需的所有属性 除非属性具有特定类型 这是我想要实现的目标的示例 假设我有以下类型 F type FooType id int name string optio