序列化F#选项类型

Law*_*nce 9 f# json.net

考虑下面的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}
Run Code Online (Sandbox Code Playgroud)

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

{"CrucialProperty":500,"OptionalProperty":"Hello"}
{"CrucialProperty":500,"OptionalProperty":null}
{"CrucialProperty":500}
Run Code Online (Sandbox Code Playgroud)

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

我已经设法在那里找到了一些"OptionConverters"(例如这里),但它们似乎并不像我正在寻找的那样.

Rei*_*ans 4

我推荐 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)
Run Code Online (Sandbox Code Playgroud)

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