Elixir从json / struct获取键/值对

时间:2016-12-12 21:07:25

标签: functional-programming elixir

成为Elixir和函数式编程的新手,我有一些问题需要获取"品味"这个结构的关键。

json = response.body
icecream = Poison.decode!(json, as: %{"items" => [%Icecream{}]})

Returns:
[%{"items" => [%MyModule.Icecream{size: "Large",
 taste: "Pistachio"}]}]

我只想以最优化的方式将品味(" Pistachio")保存到变量中。

我期待着开悟。 :)

解决方案: 我自己想出了这个:

taste = List.first(icecream["items"]).taste

3 个答案:

答案 0 :(得分:2)

使用管道,你可以

icecream |> hd |> Map.get("items") |> hd |> Map.get(:taste)

但是,我建议您将get_in/2Access helpers结合使用,IMO会产生非常易读的代码,对于更复杂的案例来说似乎更好。

import Access
get_in icecream, [at(0), key!("items"), at(0), key!(:taste)]

答案 1 :(得分:0)

您还可以使用简单的模式匹配:

[%{"items" => [%{taste: taste_val}]}] = your_result

它将taste值保存到变量taste_val中。如果您的结果没有taste,那么当您使用nil模块定义结构时,它将设置为defstruct(或您的默认值)。

答案 2 :(得分:0)

您还可以使用Map.getMap.fetch 见:https://hexdocs.pm/elixir/Map.html#fetch/2

请记住,如果您正在使用

Map.fetch!(map,key)

map中的密钥不存在时,可能会导致副作用(抛出错误)。如果您使用的是Map.fetch(map,key),则会返回一个 ok 错误状态的元组,表示keymap的可用性}。