序列化 F# 选项类型



请考虑下面的 F# 片段:

type MyType = {  
    CrucialProperty: int
    OptionalProperty: string option 
}
let first = { CrucialProperty = 500; OptionalProperty = Some("Hello")}
let second = { CrucialProperty = 500; OptionalProperty = Some(null)}
let third = { CrucialProperty = 500; OptionalProperty = None}

我希望使用 JSON.NET 序列化此类型,以便针对上述情况分别获得以下字符串:

{"CrucialProperty":500,"OptionalProperty":"Hello"}
{"CrucialProperty":500,"OptionalProperty":null}
{"CrucialProperty":500}

本质上,问题归结为能够根据属性的值在序列化输出中包含/排除该属性。

我已经设法在那里找到了一些"选项转换器"(例如这里),但它们似乎并没有完全满足我的需求。

我会推荐 FifteenBelow的转换器,它适用于 JSON.NET 但提供序列化 F# 类型 https://github.com/15below/FifteenBelow.Json(显然已移至 https://github.com/kolektiv/FifteenBelow.Json)。

从他们的使用部分:

let converters =
    [ OptionConverter () :> JsonConverter
      TupleConverter () :> JsonConverter
      ListConverter () :> JsonConverter
      MapConverter () :> JsonConverter
      BoxedMapConverter () :> JsonConverter
      UnionConverter () :> JsonConverter ] |> List.toArray :> IList<JsonConverter>
let settings =
    JsonSerializerSettings (
        ContractResolver = CamelCasePropertyNamesContractResolver (), 
        Converters = converters,
        Formatting = Formatting.Indented,
        NullValueHandling = NullValueHandling.Ignore)

具体来说,您正在寻找的是NullValueHandling = NullValueHandling.Ignore位。

FSharp.JsonSkippable 库允许您以简单且强类型的方式控制在序列化时是否包含给定属性(并确定反序列化时是否包含属性),此外,还可以单独控制/确定可空性的排除项。(完全披露:我是图书馆的作者。

相关内容

  • 没有找到相关文章

最新更新