在ELM中解码嵌套的可变长度JSON [英] Decode nested variable-length JSON in ELM

查看:86
本文介绍了在ELM中解码嵌套的可变长度JSON的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法解决在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆