2015-04-16 73 views
9

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

本質上,問題歸結爲能夠基於該屬性的值在序列化輸出中包含/排除屬性。

我已經設法找到一些「OptionConverters」(例如here),但他們似乎並沒有做我正在尋找的東西。

回答

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位。