ELM如何解码json数组中的不同值

时间:2016-09-16 22:23:54

标签: arrays json parsing decode elm

我有一个在数组中具有不同值的JSON数组,我不知道如何解析它。这是一个例子:

[
  {
    "firstname": "John",
    "lastname": "Doe",
    "age": 30
  },
  {
    "companyName": "Doe enterprise",
    "location": "NYC",
    "numberOfEmployee": 10
  }
]

所以我的JSON是这样的,数组的第一个元素是用户,第二个元素是公司。 我有相同的榆树:

type alias User =
  { firsname : String
  , lastname : String
  , age : Int
  }

type alias Company =
  { companyName : String
  , location : String
  , numberOfEmployee : Int
  }

然后:Task.perform FetchFail FetchPass (Http.get decodeData url)

那么如何在我的User函数中获得CompanyFetchPass次传递? 有类似Json.Decode.at之类的内容,但它只适用于对象。 有没有办法做这样的事情?

decodeData =
  Json.at [0] userDecoder
  Json.at [1] companyDecoder

1 个答案:

答案 0 :(得分:5)

Json.at也适用于数组索引。首先,您需要一个Data类型来保存用户和公司:

import Json.Decode as Json exposing ((:=))

type alias Data =
  { user : User
  , company : Company
  }

您需要为用户和公司提供简单的解码器:

userDecoder : Json.Decoder User
userDecoder =
  Json.object3 User
    ("firstname" := Json.string)
    ("lastname" := Json.string)
    ("age" := Json.int)

companyDecoder : Json.Decoder Company
companyDecoder =
  Json.object3 Company
    ("companyName" := Json.string)
    ("location" := Json.string)
    ("numberOfEmployee" := Json.int)

最后,您可以使用Json.at获取这些数组索引的值。与您的示例的不同之处在于您需要传递包含整数索引而不是int:

的字符串
dataDecoder : Json.Decoder Data
dataDecoder =
  Json.object2 Data
    (Json.at ["0"] userDecoder)
    (Json.at ["1"] companyDecoder)