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

标签 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 ?

最佳答案

我今天遇到了同样的问题,通过创建自定义 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

关于f# - 无法为 Microsoft.FSharp.Core.Unit 生成自动编码器。请传递一个额外的编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56542404/

相关文章:

f# - TeamCity 中的 FAKE(F# Make)dotCover 覆盖范围

f# - 如何在 F# 中计算 n 个序列的笛卡尔积?

javascript - 寓言文档 Pojo 属性

asp.net-core - 知道为什么在 F# 中跳过 C# 扩展调用吗?

asynchronous - 选择第一个异步结果

f# - 如何在 Foq 中设置返回 async<T> 的模拟?

f# - 如何从 Fable 中的 NPM 模块导入函数?

f# - 从 Fable.Remoting 返回异步值

f# - 长颈鹿和AspNetCore.Identity : Error opening Binary File