Невозможно сгенерировать автоматический кодировщик для Microsoft.FSharp.Core.Unit. Пожалуйста, передайте дополнительный кодировщик

Я создал вспомогательную функцию для возврата json в стиле Thoth.Json из моего проекта Giraffe, который принимает 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?

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
Другие вопросы по тегам