Elm:使用elm-decode-pipeline解码嵌套的对象数组

Jef*_*del 3 json decode elm

我正在努力使用NoRedInk/elm-decode-pipeline从OpenWeatherMap转换JSON响应.我已经成功解码了JSON中的嵌套对象,但是对于一个对象数组我不能这样做

我已经包含了我目前的代码.它编译但在运行时失败FetchWeather Err BadPayload ...

JSON

{
     "weather":[{"id":804}],
     "main":{"temp":289.5},
}
Run Code Online (Sandbox Code Playgroud)

type alias OpenWeatherResponse =
  { main: MainResult
  , weather: WeatherResult
  }

type alias MainResult =
  { temp: Float }

type alias ConditionResult =
  { code: Int }

decodeOpenWeatherResponse : Decoder OpenWeatherResponse
decodeOpenWeatherResponse =
    decode OpenWeatherResponse
        |> required "main" decodeMain
        |> required "weather" decodeConditions

decodeMain : Decoder MainResult
decodeMain =
    decode MainResult
        |> required "temp" float

decodeConditions : Decoder ConditionResult
decodeConditions =
     decode ConditionResult
        |> required "id" int -- This is clearly wrong --
Run Code Online (Sandbox Code Playgroud)

Shu*_*awa 5

您可以使用Json.Decode.list : Decoder a -> Decoder (List a)从项目的解析器创建列表的解析器.

decodeConditions : Decoder (List ConditionResult)
decodeConditions =
    Json.Decode.list decodeCondition

decodeCondition : Decoder ConditionResult
decodeCondition =
    decode ConditionResult
        |> required "id" int
Run Code Online (Sandbox Code Playgroud)

或者,您可以使它看起来像管道的一部分:

decodeConditions : Decoder (List ConditionResult)
decodeConditions=
    decode ConditionResult
        |> required "id" int
        |> Json.Decode.list
Run Code Online (Sandbox Code Playgroud)

此外,响应类型必须有一个列表:

type alias OpenWeatherResponse =
  { main : MainResult
  , weather : List ConditionResult
  }
Run Code Online (Sandbox Code Playgroud)

编辑

如果您只想要weather数组的第一项,您可以使用Json.Decode.index : Int -> Decoder a -> Decoder a:

decodeConditions : Decoder ConditionResult
decodeConditions =
     decode ConditionResult
        |> required "id" int
        |> Json.Decode.index 0
Run Code Online (Sandbox Code Playgroud)