とニレへの私のJSONは、次のようになります。デコード多型JSONオブジェクトandThen
{ "items" :
[ { "type" : 0, "order": 10, "content": { "a" : 10, "b" : "description", ... } }
, { "type" : 1, "order": 11, "content": { "a" : 11, "b" : "same key, but different use", ... } }
, { "type" : 2, "order": 12, "content": { "c": "totally different fields", ... } }
...
]
}
と私はデコード中に作成するためにどのような労働組合のタイプを決定するtype
値を使用します。そこで、elmの上記のすべてのエイリアスタイプとデコーダを定義しました。
import Json.Decode exposing (..)
import Json.Decode.Pipeline exposing (..)
type alias Type0Content = { a : Int, b : String }
type alias Type1Content = { a : Int, b2 : String }
type alias Type2Content = { c : String }
type Content = Type0 Type0Content | Type1 Type1Content | Type2 Type2Content
type alias Item = { order : Int, type : Int, content: Content }
decode0 = succeed Type0Content
|> requiredAt ["content", "a"] int
|> requiredAt ["content", "b"] string
decode1 = succeed Type1Content
|> requiredAt ["content", "a"] int
|> requiredAt ["content", "b"] string
decode2 = succeed Type2Content
|> requiredAt ["content", "c"] string
decodeContentByType hint =
case hint of
0 -> Type0 decode0
1 -> Type1 decode1
2 -> Type2 decode2
_ -> fail "unknown type"
decodeItem = succeed Item
|> required "order" int
|> required "type" int `andThen` decodeContentByType
必要に応じて最後の2つの機能を使用することはできません。 私はBrian Thicksのjson-survival-kitの33ページを読んだことがありますが、それは私を軌道に乗せませんでした。
アドバイスや講演は高く評価されました!
あなたは 'required'と' custom'がJson.Decode.Pipeline' 'に属していることを言及するのを忘れてしまいました。コアパッケージに固執したい場合は、 'map3'と' field'を代わりに使うことができます。 –
解決法と役立つ説明については、ChadとChrisに感謝します。非常に多くの0.18以前のチュートリアルを見つけ出し、 'Decode.Pipeline.custom'の新しい説明さえも役に立ちませんでした。あなたの記述はずっと多くを助けました。 –