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

时间:2019-06-11 11:09:59

标签: 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 -> ...

这很好,直到我返回Ok ()为止,它可以编译并且应该是完全有效的。

但是,Thoth.Json并不喜欢它:

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

如何检查resultunit还是使自动编码器句柄unit

1 个答案:

答案 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