是长生不老药和功能编程的新手,我有一些问题可以从该结构中获取"味觉"钥匙。
json = response.body
icecream = Poison.decode!(json, as: %{"items" => [%Icecream{}]})
Returns:
[%{"items" => [%MyModule.Icecream{size: "Large",
taste: "Pistachio"}]}]
我只想以最优化的方式获取味道("开心果")。
我期待着开明。:)
解决方案:我自己想到了这个:
taste = List.first(icecream["items"]).taste
使用管道,您可以做
icecream |> hd |> Map.get("items") |> hd |> Map.get(:taste)
但是,我建议您将get_in/2
与Access
助手一起使用,IMO会产生非常可读的代码,并且对于更复杂的情况似乎更好。
import Access
get_in icecream, [at(0), key!("items"), at(0), key!(:taste)]
您也可以使用简单的模式匹配:
[%{"items" => [%{taste: taste_val}]}] = your_result
它将taste
值保存到可变taste_val
中。如果您的结果没有taste
,则将其设置为nil
(或您的默认值),因为您将模块与defstruct
一起定义结构。
您也可以使用Map.get
或Map.fetch
请参阅:https://hexdocs.pm/elixir/map.html#fetch/2)
请记住,如果您正在使用
Map.fetch!(map,key)
当map
中不存在键时,您可能会导致副作用(错误抛出)。如果您使用的是Map.fetch(map,key)
,则可以将元组与 ok ok >或 error 状态,表示key
中的CC_13的可用性。