Skip to content

Instantly share code, notes, and snippets.

@renato04
Created August 23, 2019 14:16
Show Gist options
  • Save renato04/95eb42fb437f749c9f31705a2e76b924 to your computer and use it in GitHub Desktop.
Save renato04/95eb42fb437f749c9f31705a2e76b924 to your computer and use it in GitHub Desktop.
Convert string list option to an empty list in Json
open System
open Microsoft.FSharp.Reflection
open Newtonsoft.Json
open Newtonsoft.Json.Converters
type OptionConverter() =
inherit JsonConverter()
override x.CanConvert(t) =
t.IsGenericType && t.GetGenericTypeDefinition() = typedefof<option<_>>
override x.WriteJson(writer, value, serializer) =
let value =
if isNull value then null
else
let _,fields = FSharpValue.GetUnionFields(value, value.GetType())
fields.[0]
serializer.Serialize(writer, value)
override x.ReadJson(reader, t, existingValue, serializer) =
let innerType = t.GetGenericArguments().[0]
let innerType =
if innerType.IsValueType then (typedefof<Nullable<_>>).MakeGenericType([|innerType|])
else innerType
let value = serializer.Deserialize(reader, innerType)
let cases = FSharpType.GetUnionCases(t)
if isNull value then FSharpValue.MakeUnion(cases.[0], [||])
else FSharpValue.MakeUnion(cases.[1], [|value|])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment