【问题标题】:Elm JSON decoder for Union type with data带有数据的 Union 类型的 Elm JSON 解码器
【发布时间】:2018-12-13 09:15:43
【问题描述】:

我的 json 看起来像这样:

{"name": "providerWithVal", "value": "example"}

或者像这样:

{"name": "provider2"}

{"name": "provider3"}

我的 Elm 联合类型是这样定义的:

type Provider
    = ProviderWithVal String
    | Provider2
    | Provider3

我可以为没有附加数据的联合类型编写解码器。但是ProviderWithVal 需要一个字符串,我不确定如何使它全部工作。

这是我目前所拥有的:

import Json.Decode as D

providerDecoder : D.Decoder Provider
providerDecoder =
    D.field "name" D.string |> D.andThen providerNameDecoder

providerNameDecoder : String -> D.Decoder Provider
providerNameDecoder string =
    case string of
        "providerWithVal" -> D.succeed ProviderWithVal
        "provider2" -> D.succeed Provider2
        "provider3" -> D.succeed Provider3
        _ -> D.fail <| "Invalid provider: " ++ string

【问题讨论】:

  • 编译器抱怨我的 case 语句的第一个分支。我觉得我很接近了,但我不确定如何获得分配给 ProviderWithVal 构造函数的值。

标签: json functional-programming decode elm


【解决方案1】:

您的问题的快速解决方案是将D.succeed ProviderWithVal 替换为D.map ProviderWithVal (D.field "value" Decode.string)

但我会创建一个助手来匹配目标字符串,然后按以下方式使用它:

decoder =
    Decode.oneOf [ decodeWithVal, decodeP2, decodeP3 ]


decodeWithVal =
    exactMatch (Decode.field "name" Decode.string)
        "providerWithVal"
        (Decode.map ProviderWithVal <| Decode.field "value" Decode.string)


decodeP2 =
    exactMatch (Decode.field "name" Decode.string) "provider2" (Decode.succeed Provider2)


decodeP3 =
    exactMatch (Decode.field "name" Decode.string) "provider3" (Decode.succeed Provider3)


exactMatch : Decoder String -> String -> Decoder a -> Decoder a
exactMatch matchDecoder match dec =
    matchDecoder
        |> Decode.andThen
            (\str ->
                if str == match then
                    dec

                else
                    Decode.fail <| "[exactMatch] tgt: " ++ match ++ " /= " ++ str
            )

【讨论】:

    猜你喜欢
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2017-02-12
    • 1970-01-01
    相关资源
    最近更新 更多