Elm:使用 elm-decode-pipeline 解码嵌套的对象数组
Elm: Decoding a nested array of objects with elm-decode-pipeline
我正在努力使用 NoRedInk/elm-decode-pipeline 转换来自 OpenWeatherMap 的 JSON 响应。我设法解码了 JSON 中的嵌套对象,但我无法对对象数组
执行相同的操作
我已经包含了我目前拥有的代码。它编译但在 运行 和 FetchWeather Err BadPayload ...
时失败
JSON
{
"weather":[{"id":804}],
"main":{"temp":289.5},
}
代码
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 --
您可以使用 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
或者,您可以使其看起来像管道的一部分:
decodeConditions : Decoder (List ConditionResult)
decodeConditions=
decode ConditionResult
|> required "id" int
|> Json.Decode.list
此外,响应类型必须有一个列表:
type alias OpenWeatherResponse =
{ main : MainResult
, weather : List ConditionResult
}
如果你只想要 weather
数组的第一项,你可以使用 Json.Decode.index : Int -> Decoder a -> Decoder a
:
decodeConditions : Decoder ConditionResult
decodeConditions =
decode ConditionResult
|> required "id" int
|> Json.Decode.index 0
我正在努力使用 NoRedInk/elm-decode-pipeline 转换来自 OpenWeatherMap 的 JSON 响应。我设法解码了 JSON 中的嵌套对象,但我无法对对象数组
执行相同的操作我已经包含了我目前拥有的代码。它编译但在 运行 和 FetchWeather Err BadPayload ...
JSON
{
"weather":[{"id":804}],
"main":{"temp":289.5},
}
代码
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 --
您可以使用 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
或者,您可以使其看起来像管道的一部分:
decodeConditions : Decoder (List ConditionResult)
decodeConditions=
decode ConditionResult
|> required "id" int
|> Json.Decode.list
此外,响应类型必须有一个列表:
type alias OpenWeatherResponse =
{ main : MainResult
, weather : List ConditionResult
}
如果你只想要 weather
数组的第一项,你可以使用 Json.Decode.index : Int -> Decoder a -> Decoder a
:
decodeConditions : Decoder ConditionResult
decodeConditions =
decode ConditionResult
|> required "id" int
|> Json.Decode.index 0