sev*_*rin 3 f# fable-f# f#-giraffe
我创建了一个辅助函数,用于从我的 Giraffe 项目返回 Thoth.Json 样式的 json,该函数接受Result<'a,'b>
并返回 JSON。
let json result next (ctx: HttpContext) =
match result with
| Ok result ->
(setHttpHeader "Content-Type" "application/json" >=>
setBodyFromString (Encode.Auto.toString (0, result))) next ctx
| Error e -> ...
Run Code Online (Sandbox Code Playgroud)
这工作正常,直到我返回Ok ()
,它编译并且应该完全有效。
然而,Thoth.Json 不太喜欢它:
Cannot generate auto encoder for Microsoft.FSharp.Core.Unit. Please pass an extra encoder.
我怎样才能检查是否result
是一个unit
或使自动编码器句柄unit
?
小智 7
我今天遇到了同样的问题,通过创建自定义Encoder<'T>
和Decoder<T>
. 有趣的是,一个月前这是没有必要的,我发誓我没有更新任何东西。
这就是编码器的样子,您可以使用任何 JSON 作为返回值。
open Thoth.Json.Net
module UnitEncoder =
let encoder = fun _ -> JsonValue.Parse("null")
let decoder = fun _ _ -> Ok ()
Run Code Online (Sandbox Code Playgroud)
您可以像这样定义序列化器
let extraCoders =
Extra.empty
|> Extra.withDecimal
|> Extra.withCustom UnitEncoder.encoder UnitEncoder.decoder
let serializer = Thoth.Json.Giraffe.ThothSerializer(extra = extraCoders)
Run Code Online (Sandbox Code Playgroud)
并像往常一样将其注册为服务
services.AddSingleton<Giraffe.Serialization.Json.IJsonSerializer>(CN.ReportingServices.API.Serialization.serializer) |> ignore
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
551 次 |
最近记录: |