将JSON元组解码为Elm元组

时间:2017-03-09 19:21:57

标签: json elm

我的JSON如下所示

{ "resp":
    [ [1, "things"]
    , [2, "more things"]
    , [3, "even more things"]
    ]
}

问题是我无法将JSON元组解析为Elm元组:

decodeThings : Decoder (List (Int, String))
decodeThings = field "resp" <| list <| map2 (,) int string

它编译,但是当它运行时,它会抛出

BadPayload "Expecting an Int at _.resp[2] but instead got [3, \"even more things\"]

出于某种原因,它只将[3, "even more things"]视为一件事而不是JSON格式的元组 如何将我的JSON解析为List (Int, String)

3 个答案:

答案 0 :(得分:9)

import Json.Decode exposing (map2, index, string, list)

最简单的是

map2 Tuple.pair (index 0 string) (index 1 string)

然后,如您所知,列表

list <| map2 Tuple.pair (index 0 string) (index 1 string)

答案 1 :(得分:8)

你需要一个解码器,它将大小为2的javascript数组转换为大小为2的Elm元组。这是一个示例解码器:

arrayAsTuple2 : Decoder a -> Decoder b -> Decoder (a, b)
arrayAsTuple2 a b =
    index 0 a
        |> andThen (\aVal -> index 1 b
        |> andThen (\bVal -> Json.Decode.succeed (aVal, bVal)))

然后您可以按如下方式修改原始示例:

decodeThings : Decoder (List (Int, String))
decodeThings = field "resp" <| list <| arrayAsTuple2 int string

(请注意,如果有两个以上的元素,我的示例解码器不会失败,但它应该指向正确的方向)

答案 2 :(得分:1)

我无法使用Chad Gilbert或Simon H的解决方案来与Elm 0.19一起使用。我对Elm很陌生,但这就是我可以开始工作的地方:

import Json.Decode as Decode
import Json.Decode.Extra as Decode

{-| Decodes two fields into a tuple.
-}
decodeAsTuple2 : String -> Decode.Decoder a -> String -> Decode.Decoder b -> Decode.Decoder (a, b)
decodeAsTuple2 fieldA decoderA fieldB decoderB =
    let
        result : a -> b -> (a, b)
        result valueA valueB =
            (valueA, valueB)
    in
        Decode.succeed result
            |> Decode.andMap (Decode.field fieldA decoderA)
            |> Decode.andMap (Decode.field fieldB decoderB)