Как декодировать JSON с типом свойства переменной

У меня есть следующий JSON:

{
    "items": [
        {
            "level": 1,
            "displayValue": "das",
            "dataValue": "das"
        },
        {
            "level": 2,
            "displayValue": "das",
            "dataValue": {
                "name": "some name",
                "scope": "some scope"
            }
        }
    ]
}

И следующие типы:

type alias Item = 
    { level: Int
    , displayValue: String
    , dataValue: DataValue
    }

type alias KeyValue =
    { name: String
    , scope: String
    }

type DataValue
    = Value String
    | Key KeyValue

Как бы я написал декодер для свойства dataValue, поскольку он может быть двух совершенно разных типов?

1 ответ

Решение

Ты можешь использовать oneOf:

import Json.Decode as JD

dataValueDecoder : JD.Decoder DataValue
dataValueDecoder =
    JD.oneOf
        [ JD.map Value JD.string 
        , JD.map Key keyValueDecoder
        ]

keyValueDecoder : JD.Decoder KeyValue
keyValueDecoder =
    JD.map2 KeyValue
        (JD.field "name" JD.string)
        (JD.field "scope" JD.string)
Другие вопросы по тегам