将类型的缺失值反序列化为特定值

时间:2018-03-26 13:59:34

标签: f# json.net

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

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

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

我知道DefaultValueAttribute,但这只适用于常量值,而且我不想在我的DTO中的每个Skippable - 包裹属性上使用属性。< / p>

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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