[英]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:我认为这里有两个问题:
'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.