Невозможно сгенерировать автоматический кодировщик для 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