我正在努力使用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)
您可以使用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)
| 归档时间: |
|
| 查看次数: |
866 次 |
| 最近记录: |