简体   繁体   English

F# 自定义 JsonConverter 选项

[英]F# Custom JsonConverter for Option

I'm trying to create an option type customer serialiser here is the JsonConverter我正在尝试创建一个选项类型的客户序列化程序,这里是JsonConverter

I've got:我有:

type OptionConverter<'T> =
    inherit JsonConverter<'T>
    override __.WriteJson (writer: Utf8JsonWriter, value: 'T option, serializer: JsonSerializerOptions) : unit =
        match value with
        | Some optionValue -> 
            JsonSerializer.Serialize(writer, optionValue, serializer)
        | None -> 
            writer.WriteNullValue()

    override __.ReadJson (reader: byref<Utf8JsonWriter>, typeToConvert: Type, serializer: JsonSerializerOptions): 'T =
        failwith "Not implemented"

type OptionConverterFactory =
    inherit JsonConverterFactory
    override __.CanConvert(typeToConvert: Type) = 
        let isOption = if typeToConvert.GetGenericTypeDefinition() = typeof<option<_>> then true else false
        isOption
    override __.CreateConverter(typeToConvert: Type, options: JsonSerializerOptions) : JsonConverter =
        let optionType = typeToConvert.GetGenericArguments().[0]
        let converter = Activator.CreateInstance(typeof<OptionConverter<_>>.MakeGenericType([| optionType |])) :?> JsonConverter
        converter

I get red line underneath WriteJson saying no abstract or interface member found that corresponds with this override...我在 WriteJson 下面得到红线,说没有找到与此覆盖对应的抽象或接口成员...

Also, if I change WriteJson and ReadJson to member then OptionConvert<'T> gets red underline saying that WriteJson and ReadJson have not been implemented...另外,如果我将 WriteJson 和 ReadJson 更改为成员,则 OptionConvert<'T> 会出现红色下划线,表示 WriteJson 和 ReadJson 尚未实现......

How do I fix this?我该如何解决?

I think there are two problems here:我认为这里有两个问题:

  1. The wrong methods are being overloaded错误的方法被重载
  2. You need to constrain your 'T to be an option.您需要将'T限制为一个选项。

This compiled:这编译:

open System
open System.Text.Json
open System.Text.Json.Serialization

type OptionConverter<'T> =
    inherit JsonConverter<Option<'T>>

    override _.Write(writer, value, serializer) =
        match value with
        | Some optionValue -> 
            JsonSerializer.Serialize(writer, optionValue, serializer)
        | None -> 
            writer.WriteNullValue()

    override _.Read(reader, typeToConvert, options) =
        failwith "Not implemented"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM