2015-04-16 10 views
9

consideri il # frammento F di seguito:Serializzare F # tipi di opzione

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} 

desidero fare serializzare questo tipo utilizzando JSON.NET così ottengo le seguenti stringhe, rispettivamente, per i casi sopra descritti:

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

In sostanza, il problema si riduce alla possibilità di includere/escludere una proprietà nell'output serializzato in base al valore di tale proprietà.

Sono riuscito a trovare alcuni "OptionConverters" là fuori (ad esempio here), ma non sembrano proprio fare ciò che sto cercando.

risposta

2

Suggerirei convertitori di FifteenBelow che lavorano con JSON.NET ma forniscono serializzazione F # tipi https://github.com/15below/FifteenBelow.Json

Dalla loro sezione utilizzo

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) 

In particolare ciò che stai cercando è il bit NullValueHandling = NullValueHandling.Ignore.

Problemi correlati