Option converter for Newtonsoft!

//      Ayrat Hudaygulov, [17.03.19 00:52] https://t.me/fsharp_chat
/// For Some 1 genereates "1", for None generates "null"
type OptionConverter() =
    inherit JsonConverter()

    override x.CanConvert(typ) = typ.IsGenericType && typ.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, typ, existingValue, serializer) =
        let innerType =
            let innerType = typ.GetGenericArguments().[0]
            if innerType.IsValueType then typedefof<Nullable<_>>.MakeGenericType([|innerType|])
            else innerType

        let cases = Util.getAndCacheUnionCases typ
        if reader.TokenType = JsonToken.Null then FSharpValue.MakeUnion(cases.[0], Array.empty)
        else
            let value = serializer.Deserialize(reader, innerType)
            if isNull value then FSharpValue.MakeUnion(cases.[0], Array.empty)
            else FSharpValue.MakeUnion(cases.[1], [|value|])

 ///......
let s = new JsonSerializer()
s.Converters.Add(new OptionConverter())

s.Serialize(someObject)