考虑下面的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"在那里(例如here),但他们似乎没有做我正在寻找的事情。
答案 0 :(得分:2)
我会推荐使用JSON.NET的FifteenBelow转换器,但提供序列化F#类型https://github.com/15below/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
位。
答案 1 :(得分:0)
FSharp.JsonSkippable库允许您以简单且类型明确的方式控制序列化时是否包含给定属性(并在反序列化时确定是否包含属性),此外,还可以控制/确定排除可空性。 (完全公开:我是图书馆的作者。)