Erlang:从Key / Value元组中提取值

时间:2014-11-05 14:42:06

标签: get erlang key tuples

我有一个如下所示的元组列表:

{[{<<"id">>,1},
  {<<"alerts_count">>,0},
  {<<"username">>,<<"santiagopoli">>},
  {<<"facebook_name">>,<<"Santiago Ignacio Poli">>},
  {<<"lives">>,{[{<<"quantity">>,8},
                 {<<"max">>,8},
                 {<<"unlimited">>,true}]}}]}

我想知道如何从该元组中提取属性。例如:

get_value("id",TupleList), %% should return 1.

get_value("facebook_name",TupleList), %% should return "Santiago Ignacio Poli".

get_value("lives"), %% should return another TupleList, so i can call      

get_value("quantity",get_value("lives",TupleList)).

我试图匹配所有&#34;属性&#34;到一个名为&#34; User&#34;但我不知道该怎么做。

更具体一点:我使用Jiffy库(github.com/davisp/jiffy)来解析JSON。现在我想从该JSON获取一个值。

谢谢!

2 个答案:

答案 0 :(得分:2)

第一个奇怪的事情是元组包含单个项目列表:[{Key, Value}]无条件地嵌入{}。因此,让我们将您编写的所有内容作为名为Stuff的变量引用,并将其拉出来:

{KVList} = Stuff

良好的开端。现在我们正在处理{Key, Value}类型列表。完成后,我们现在可以做到:

lists:keyfind(<<"id">>, 1, KVList)

或者:

proplists:get_value(<<"id">>, KVList)

...我们会得到您提出的第一个答案。 (注意在你从这里复制一些代码之前,如果Key不在KVList中,两者可能返回的区别......)。

对这种特殊问题的进一步研究分为两个截然不同的领域:

  • 关于具有{Key, Value}函数的数据函数的Erlang文档(提示:listsproplistsorddict以及基于相同概念的任何其他模块都是好的研究的候选人,所有在标准库中),包括基本过滤器和地图。
  • 数据结构的基本概念是具有语义意义的结构。老实说,我没有在高级类型系统之外的函数式编程世界中看到很多刻意的想法(比如在Haskell中,或者Dialyzer努力给你的东西)。了解这一点的最佳地点是关系数据库概念 - 一旦你知道“5NF”真正意味着什么,那么回到现实世界,你将拥有一个不同的,更具洞察力的视角,像这样的问题不仅仅是微不足道的,他们会求更好的基础。

答案 1 :(得分:0)

您应该查看proplists module及其proplist:get_value/2功能。

您只需要考虑当列表中不存在Key时它应该如何表现(或者是默认的支持者行为满足)。

还有两个笔记:

  • 因为您的密钥是二进制的,所以您应该在函数中使用<<"id">>
  • proplists在列表上工作,但是您呈现的数据列在一个元素元组中。所以你需要提取这个Data

    {PropList} = Data, Id = proplists:get_value(<<"id">>, PropList),