无法为 Microsoft.FSharp.Core.Unit 生成自动编码器。请传递一个额外的编码器

Cannot generate auto encoder for Microsoft.FSharp.Core.Unit. Please pass an extra encoder

我从我的 Giraffe 项目中为 returning Thoth.Json 样式 json 创建了一个辅助函数,该函数采用 Result<'a,'b> 和 returns 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 -> ...

这在我 return Ok () 之前工作正常,它编译并且应该是完全有效的。

不过Thoth.Json不是很喜欢:

Cannot generate auto encoder for Microsoft.FSharp.Core.Unit. Please pass an extra encoder.

如何检查 result 是否为 unit 或使自动编码器处理 unit

我今天遇到了同样的问题,通过创建自定义 Encoder<'T>Decoder<T> 解决了这个问题。有趣的是,一个月前这还不是必需的,我发誓我没有更新任何东西。

这是编码器的样子,您可以使用任何 JSON 作为 return 值。

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