我创建了一个辅助函数,用于从我的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 -> ...
这很好,直到我返回Ok ()
为止,它可以编译并且应该是完全有效的。
但是,Thoth.Json并不喜欢它:
Cannot generate auto encoder for Microsoft.FSharp.Core.Unit. Please pass an extra encoder.
如何检查result
是unit
还是使自动编码器句柄unit
?
答案 0 :(得分:1)
我今天遇到了同样的问题,通过创建自定义Encoder<'T>
和Decoder<T>
解决了这个问题。有趣的是,一个月前没有必要这样做,我发誓我什么也没更新。
这是编码器的外观,您可以使用任何JSON作为返回值。
open Thoth.Json.Net
module UnitEncoder =
let encoder = fun _ -> JsonValue.Parse("null")
let decoder = fun _ _ -> Ok ()
您可以这样定义序列化器
let extraCoders =
Extra.empty
|> Extra.withDecimal
|> Extra.withCustom UnitEncoder.encoder UnitEncoder.decoder
let serializer = Thoth.Json.Giraffe.ThothSerializer(extra = extraCoders)
并像往常一样将其注册为服务
services.AddSingleton<Giraffe.Serialization.Json.IJsonSerializer>(CN.ReportingServices.API.Serialization.serializer) |> ignore