JSON响应
{ data:
{ id: 1
, name: 'item 1'
, price: '$10'
}
}
榆木文件
import Json.Decode exposing (Decoder, succeed, string, int)
import Json.Decode.Pipeline exposing (optional, required)
-- TYPES --
type alias DataRes =
{ data : Item }
type alias Item =
{ id : Int
, name : String
, price : String
}
-- DECODERS --
dataResDecoder : Decoder DataRes
dataResDecoder =
succeed DataRes
|> required "data" itemDecoder
itemDecoder : Decoder Item
itemDecoder =
succeed Item
|> required "id" int
|> required "name" string
|> required "price" string
-- UPDATES --
type Msg
= GotItem (Result Http.Error DataRes)
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
GotItem (Ok result) ->
updateGotItems result model
-- ACTIONS --
getItem : Int -> Cmd Msg
getItem id =
Http.get
{ url = "https://example.com/items/" ++ id
, expect = Http.expectString GotItem dataResDecoder
}
我在getItem
打电话给init
。
我的问题是对于嵌套JSON的2个级别,我必须创建2个别名类型和2个解码器。如果它是3级,那么总共将是6级(3型和3个解码器),非常痛苦。
我考虑过Decode.at
,但是我不知道如何替换DataRes
中的GotItem (Result Http.Error DataRes)
和dataResDecoder
中的expect = Http.expectString GotItem dataResDecoder
。
有什么建议吗?
谢谢。
答案 0 :(得分:0)
例如,您在正确的轨道上at
。无需在Elm中使用数据结构包装器复制所有json包装。
看起来您真正想要的就是
dataResDecoder : Decoder Item
dataResDecoder =
Decode.field "data" itemDecoder