2017-03-09 15 views
3

私のJSONは以下のデコードJSONタプルエルムタプルに

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

のように見える問題は、私はエルムタプルにJSONのタプルを解析することができないということです実行したとき、それは一つだけではなくJSON形式のタプルなどとして[3, "even more things"]読み込み何らかの理由で

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

をスローします。
JSONをどのようにしてList (Int, String)に解析できますか?

+1

あなたのJSONはあなたの説明と一致していません - '[1、 "物事"]' * JSON *配列*はなくJSONの*オブジェクトです(JSONタプルについて言及して以来、私は期待しています)。代わりに '{1、" things "}'を試してみるか、Elmデコーダを変更してリストのリストを受け入れてください。 –

答えて

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 

(つ以上の要素がある場合は、私の例のデコーダは失敗しないことに注意してください、しかし、それは

+0

チャームのように働いた。タプルがリストとして表されているときに、タプルのデフォルトの実装がないのはなぜですか? – Patrick

+2

以前はネイティブのjavascriptで実装されていた 'tupleN'デコーダがありましたが、削除されたものは(https://github.com/elm-lang/core/commit/3b999526e08ac517c0223a55c78cb13e752be3f8)、[index ](https://github.com/elm-lang/core/commit/c341774223da6ad30eb67d1628cbea68c6fcd27e)。私はその推論が正確に何だったのか分かりません。 –

3

最も単純な

map2 (,) (index 0 string) (index 1 string) 
です)あなたは正しい方向に指摘し得るべきです0

、その後、あなたは注意して、リストのため

list <| map2 (,) (index 0 string) (index 1 string)