如何在 SAFE 堆栈中为 Thoth.Json 编写 encoders/decoders?
How do I write encoders/decoders for Thoth.Json in the SAFE Stack?
我正在使用 SAFE 堆栈构建应用程序,我的模型中有一个 System.Uri。
当我 运行 我的代码时,我在控制台中收到错误消息“无法为 System.Uri 生成自动编码器...”
到目前为止,我的谷歌搜索让我来到这里
module CustomEncoders
open Thoth.Json
let uriEncoder (uri:System.Uri) = Encode.string (uri.ToString())
let uriDecoder = ????
let myExtraCoders =
Extra.empty
|> Extra.withCustom uriEncoder uriDecoder
let modelEncoder = Encode.Auto.generateEncoder(extra = myExtraCoders)
let modelDecoder = Decode.Auto.generateDecoder(extra = myExtraCoders)
然后在我的 App.fs 中添加
|> Program.withDebuggerCoders CustomEncoders.modelEncoder CustomEncoders.modelDecoder
我想我已经了解了如何创建编码器,但我不知道如何编写解码器部分。
我显然可以用字符串替换我的 System.Uri 字段,但感觉这不是正确的解决方案。
查看 Decoder Type,它具有以下签名
string -> JsonValue -> Result<'T, DecoderError>
在哪里
- 字符串:从 json 值
到 select 的 json 路径
- JsonValue:原始 json 解码
它要么 returns 一个 Ok<'T>
要么 Error<DecoderError>
所以你的uri Decoder将如下
let uriDecoder path (token: JsonValue) =
let value = token.Value<string>()
match System.Uri.TryCreate(value, System.UriKind.Absolute) with
| (true, uri) -> Ok uri
| (false, _) -> Error (path, BadPrimitive("Uri", token))
我正在使用 SAFE 堆栈构建应用程序,我的模型中有一个 System.Uri。
当我 运行 我的代码时,我在控制台中收到错误消息“无法为 System.Uri 生成自动编码器...”
到目前为止,我的谷歌搜索让我来到这里
module CustomEncoders
open Thoth.Json
let uriEncoder (uri:System.Uri) = Encode.string (uri.ToString())
let uriDecoder = ????
let myExtraCoders =
Extra.empty
|> Extra.withCustom uriEncoder uriDecoder
let modelEncoder = Encode.Auto.generateEncoder(extra = myExtraCoders)
let modelDecoder = Decode.Auto.generateDecoder(extra = myExtraCoders)
然后在我的 App.fs 中添加
|> Program.withDebuggerCoders CustomEncoders.modelEncoder CustomEncoders.modelDecoder
我想我已经了解了如何创建编码器,但我不知道如何编写解码器部分。
我显然可以用字符串替换我的 System.Uri 字段,但感觉这不是正确的解决方案。
查看 Decoder Type,它具有以下签名
string -> JsonValue -> Result<'T, DecoderError>
在哪里
- 字符串:从 json 值 到 select 的 json 路径
- JsonValue:原始 json 解码
它要么 returns 一个 Ok<'T>
要么 Error<DecoderError>
所以你的uri Decoder将如下
let uriDecoder path (token: JsonValue) =
let value = token.Value<string>()
match System.Uri.TryCreate(value, System.UriKind.Absolute) with
| (true, uri) -> Ok uri
| (false, _) -> Error (path, BadPrimitive("Uri", token))