【问题标题】:Deserialize missing values of type to certain value将类型的缺失值反序列化为某个值
【发布时间】:2018-03-26 13:59:34
【问题描述】:

我创建了一个名为 Skippable<'a> 的包装器类型(一个 F# 可区分联合,与 Option 不同),专门用于指示在序列化类型时应排除哪些成员:

type Skippable<'a> =
  | Skip
  | Serialize of 'a

我有正常工作的转换器,但在反序列化期间,我希望将丢失的 JSON 值序列化为 DU 的 Skip 情况(而不是当前发生的 null)。

我知道 DefaultValueAttribute,但这仅适用于常量值,此外我不想在我的 DTO 中的每个 Skippable-wrapped 属性上使用属性。

是否有可能以某种方式告诉 Newtonsoft.Json 用该类型的某个值 (Skip) 填充该类型 (Skippable&lt;'a&gt;) 的缺失值?使用转换器、合约解析器或其他方法?

【问题讨论】:

  • Skippable&lt;_&gt;写一个自定义转换器?
  • 同意,转换器在这种情况下工作得很好。你可以从 haf 的 OptionConverter 中获取灵感:github.com/haf/Newtonsoft.Json.FSharp/blob/master/src/JsonNet/…
  • 转换器在这里似乎没有帮助,因为输入 JSON 中完全缺少的属性似乎没有被调用。不过,我找到了一个潜在的解决方法(添加了答案)。

标签: f# json.net


【解决方案1】:

使Skippable 结构联合是一种方法,因为那时默认值(例如使用Unchecked.defaultOf)似乎是任何字段(在本例中为无)在其默认值的第一种情况。

[<Struct>]
type Skippable<'a> =
  | Skip
  | Serialize of 'a

// Unchecked.defaultof<Skippable<obj>> = Skip

这是FSharp.JsonSkippable库的一部分,它允许您以简单且强类型的方式控制序列化时是否包含给定属性(并确定反序列化时是否包含属性),此外,还可以控制/determine 排除可空性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 2015-02-16
    相关资源
    最近更新 更多