Как декодировать пустой объект {} в вязе? - PullRequest
1 голос
/ 26 февраля 2020

Я пишу JSON декодер для вяза (0.19.1). Мой входящий json Value является пустым объектом {}. Как я могу декодировать это значение в тип (здесь NoPayload)?

Я пытался декодировать его с помощью декодера JD.string:

JD.string
    |> JD.andThen
        (\str ->
            if str == "{}" then
                JD.succeed NoPayload

            else
                JD.fail "Failed to decode non-empty payload to NoPayload decoder"
        )

Но это привело к ошибка:

Problem with the given value:

    {}

    Expecting a STRING

В качестве альтернативы я экспериментирую с JD.null и JD.dict, но не могу найти решение.

1 Ответ

5 голосов
/ 26 февраля 2020

Вы можете проверить пустой объект, используя dict для преобразования объекта JSON в словарь, а затем проверить, что в словаре нет ключей:

import Dict
import Json.Decode as JD exposing (Decoder)

emptyJsonDecoder : Decoder Payload
emptyJsonDecoder =
    JD.dict JD.int
        |> JD.andThen
            (\entries ->
                case Dict.size entries of
                    0 ->
                        JD.succeed NoPayload

                    _ ->
                        JD.fail "Expected empty JSON object"
            )

Для проверки:

JD.decodeString emptyJsonDecoder "{}"          == Ok NoPayload
JD.decodeString emptyJsonDecoder "{\"a\":123}" == Err "Expected empty JSON object"
...