2015-04-16 2 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

Я бы порекомендовал конвертеры FifteenBelow, который работают с Json.NET но обеспечивают сериализации 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 бит.

Смежные вопросы