在ELM中解码嵌套的可变长度JSON [英] Decode nested variable-length JSON in ELM
问题描述
我无法解决在ELM中解码有点复杂的JSON响应的问题。 JSON响应结构(我无法控制)与我的应用程序的数据树/模型不匹配。
I'm having trouble wrapping my head around decoding a bit complex JSON response in ELM. The JSON response structure(I have no control over it) doesn't match my application's data tree/model.
解码器代码的外观如何JSON吗?
我正在使用 NoRedInk的Json.Decode.Pipeline - http://package.elm-lang.org/packages/NoRedInk/elm -decode-pipeline / 3.0.0 / Json-Decode-Pipeline
我的项目的 Github存储库- https://github.com/areai51/my-india-elm
JSON 响应- https://data.gov.in/node/85987/datastore/export/json
代码
type alias Leader =
{ attendance : Float <------- Logic = (Sessions Attended / Total Sessions) * 100
, name : String
, state : String
}
type alias Model =
{ leaders : WebData (List Leader)
}
initialModel : Model
initialModel =
{ leaders = RemoteData.Loading
}
JSON
请注意,没有键I可以直接映射到数据数组内部。
{
"fields":[ // Definitions for the "data" key
{
"id":"a",
"label":"S.No.",
"type":"string"
},
{
"id":"b",
"label":"Division\/Seat No.",
"type":"string"
},....
],
"data":[ <------- Leaders
[
1,
3,
"Smt. Sonia Gandhi", <------- Name
15,
12,
"Uttar Pradesh", <------- State
"Rae Barelii",
20, <------- Total Sessions (Attendance)
9 <------- Sessions Attended (Attendance)
],
[
2,
15,
"Shri Dayanidhi Maran", <------- Name
15,
12,
"Tamil Nadu", <------- State
"Chennai Central",
20, <------- Total Sessions (Attendance)
7 <------- Sessions Attended (Attendance)
],
[
3,
16,
"Shri A. Raja", <------- Name
15,
12,
"Tamil Nadu ", <------- State
"Nilgiris",
20, <------- Total Sessions (Attendance)
16 <------- Sessions Attended (Attendance)
],.....
]
}
更新的解决方案
leadersDecoder : Decode.Decoder (List Leader)
leadersDecoder =
Decode.at [ "data" ] (Decode.list leaderDecoder)
leaderDecoder : Decode.Decoder Leader
leaderDecoder =
let
sessionsAttendedDecoder =
Decode.index 7 Decode.float
|> Decode.andThen (\total -> attendanceDecoder
|> Decode.map (\attended -> (attended / total) * 100))
in
Decode.map3 Leader
sessionsAttendedDecoder
(Decode.index 2 Decode.string)
(Decode.index 5 Decode.string)
attendanceDecoder : Decode.Decoder Float
attendanceDecoder =
(Decode.oneOf
[ Decode.index 8 Decode.float
, Decode.succeed 0
]
)
推荐答案
Json.Decode.index
可用于提取特定使用指定的解码器从数组中索引出来。将其与 andThen
和 地图
进行基于多个字段的出勤率计算:
Json.Decode.index
can be used to pull a specific index out of an array with the specified decoder. Couple that with andThen
and map
to do the attendance calculation based on multiple fields:
import Json.Decode exposing (..)
leaderDecoder : Decoder Leader
leaderDecoder =
let
sessionsAttendedDecoder =
index 7 float
|> andThen (\total -> index 8 float
|> map (\attended -> (attended / total) * 100))
in
map3 Leader
sessionsAttendedDecoder
(index 2 string)
(index 5 string)
这篇关于在ELM中解码嵌套的可变长度JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!