在Elm中解码嵌套的JSON响应

时间:2019-07-10 04:25:20

标签: json elm

  

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

有什么建议吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

例如,您在正确的轨道上at。无需在Elm中使用数据结构包装器复制所有json包装。

看起来您真正想要的就是

dataResDecoder : Decoder Item
dataResDecoder =
  Decode.field "data" itemDecoder