序列化 F# Option 类型

11

考虑下面的 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}

基本上,问题归结为根据属性的值来包含/排除序列化输出中的某个属性。

我已经找到了一些“OptionConverters”(例如这里),但它们似乎不完全符合我的要求。

2个回答

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)

您需要的是NullValueHandling = NullValueHandling.Ignore部分。

这具体意味着忽略空值处理。

@kornfridge - 似乎是 https://github.com/kolektiv/FifteenBelow.Json - dbc

0

FSharp.JsonSkippable库可以让你以一种简单而强类型的方式控制序列化时是否包含给定属性(并确定反序列化时是否包含属性),并且更重要的是,可以分别控制/确定排除空值。 (全面披露:我是该库的作者。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接