【问题标题】:Get data from a JSON Array从 JSON 数组中获取数据
【发布时间】:2018-11-28 06:46:07
【问题描述】:

我有一个 JSON 数组:

response = [
  %{
    "created_at" => 1542757526,
    "email" => "bcs@yahoo.com",
    "first_name" => "rana",
    "id" => "YW1pcnBheWFyeUB5YWhvby5jb20=",
    "last_clicked" => nil,
    "last_emailed" => nil,
    "last_name" => "amir",
    "last_opened" => nil,
    "updated_at" => 1542759123
  },
  %{
    "created_at" => 1542757457,
    "email" => "abc@gmail.com",
    "first_name" => "rana",
    "id" => "cmFtaXIyNDI2QGdtYWlsLmNvbQ==",
    "last_clicked" => nil,
    "last_emailed" => nil,
    "last_name" => "amir",
    "last_opened" => nil,
    "updated_at" => 1542759001
  },
  # .......
]

我正在尝试获取response 变量中所有项目的email 字段。示例:

["bcs@yahoo.com", "xyz@gmail.com", ....]

【问题讨论】:

  • 您能展示您尝试过的任何代码吗?您的代码的哪一部分有问题?
  • 是的,当我累了 Enum.flat_map(response, fn(c) -> c["email"] end) 得到这个错误:(Protocol.UndefinedError) protocol Enumerable not implemented for "bcs@yahoo.com". This protocol is implemented for: DBConnection.PrepareStream, DBConnection.Stream, Date.Range, Ecto.Adapters.SQL.Stream, File.Stream, Function, GenEvent.Stream, HashDict, HashSet, IO.Stream, List, Map, MapSet, Postgrex.Stream, Range, Stream, Timex.Interval

标签: json elixir elixir-poison


【解决方案1】:

您正在寻找Enum.map/2。此方法对给定列表/可枚举中的每个项目调用传递的函数:

Enum.map(response, fn item -> item["email"] end )

或者,您可以使用简写并使其简洁:

Enum.map(response, &(&1["email"]))

外部资源:请参阅this 和also this 以了解函数式编程中映射 的概念。

旁注: flat_map/2 是 map/2 的变体,它期望“映射结果”是另一个列表(因此它可以与其他列表合并和展平)映射结果)。

【讨论】:

  • 感谢你救了我的命...你能详细说明一下这个功能吗?
【解决方案2】:

除了地图,你还可以看看comprehensions。本质上,它们结合了Enum.map/2 和Enum.filter/2 的功能。

它们允许您执行以下操作:

for %{"email" => email} <- response, do: email

或者这个:

for item <- response, do: item["email"]

注意两者的结果之间存在细微的行为差异:前者将过滤掉任何与左侧不匹配的项目(它只会保留带有 @987654326 的地图@key),但后者会将缺少电子邮件的项目映射到nil。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 2016-02-13
    相关资源
    最近更新 更多