从json/struct提取钥匙/值对



是长生不老药和功能编程的新手,我有一些问题可以从该结构中获取"味觉"钥匙。

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/2Access助手一起使用,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.getMap.fetch请参阅:https://hexdocs.pm/elixir/map.html#fetch/2)

请记住,如果您正在使用

Map.fetch!(map,key)

map中不存在键时,您可能会导致副作用(错误抛出)。如果您使用的是Map.fetch(map,key),则可以将元组与 ok ok >或 error 状态,表示key中的CC_13的可用性。

最新更新