2014-11-05 67 views
1

提取值我有一個看起來像這樣的元組列表:二郎:從一個鍵/值元組

{[{<<"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)). 

我試圖將所有的「屬性」匹配到一個名爲「用戶」的記錄,但我不知道該怎麼做。

更具體地說:我使用Jiffy庫(github.com/davisp/jiffy)來解析JSON。現在我想從該JSON獲取一個值。

謝謝!

回答

0

您應該查看proplists module及其proplist:get_value/2函數。

您只需要考慮當Key不存在於列表中(或默認的proplists行爲令人滿意)時它應該如何表現。

和兩個注意事項:

  • 因爲你鍵binnary,你應該在你的函數
  • proplists工作在列表使用<<"id">>,但你給出的數據是一個元素的元組內部列表。所以你需要提取這個你Data

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

+0

我試圖用這種方法,但我得到這個錯誤: { 「初始化終止於do_boot」,{function_clause,[{proplists,的get_value,[ 「ID」,{[{<<2 bytes>>,119}, {<<12 bytes>>,0},{<<8 bytes>>,<<12 bytes>>},{<<11 bytes>>,<<10 bytes>>},{<<13 bytes>>,<<21 bytes>>},{<<15 bytes>>,TRUE},{<<12 bytes>>,TRUE} ,,未定義],[ {file,「proplists.erl」},{line,225}]},{test,test,0, – 2014-11-05 14:53:36

+0

更具體地說:我使用Jiffy庫(https://github.com/davisp/jiffy)解析一個JSON。現在我想從該JSON獲取一個值。 – 2014-11-05 14:59:50

+0

已更新的答案。 – mpm 2014-11-05 15:02:16

2

第一個奇怪的是,元組包含一個項目列表:其中[{Key, Value}]嵌入{}沒有理由。因此,讓我們引用所有的東西,你寫了一個名爲Stuff變量,並將其拉出:

{KVList} = Stuff 

良好的開端。現在我們正在處理一個{Key, Value}類型列表。做完這些後,我們現在可以這樣做:

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

或交替:

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

...,我們將讓你問第一個答案。 (請注意,如果在您從這裏複製一些代碼之前,密鑰不在KVList中,那麼這兩者可能會返回什麼區別...)。

問題的這種特殊風格的進一步檢查進入兩種截然不同的領域:

  • 關於已經{Key, Value}功能(提示數據功能二郎文檔:在listsproplistsorddict,以及任何其他基於模塊在相同的概念是一個很好的候選人的研究,都在標準庫),包括基本的過濾器和地圖。
  • 數據結構的基本概念作爲語義上有意義的結構。老實說,在高級類型系統之外的功能編程領域(例如Haskell,或者Dialyzer試圖給你的東西),我沒有看到很多有意思的想法。瞭解這個最好的地方是關係數據庫的概念 - 一旦你知道什麼「5NF」確實是意味着,然後回到現實世界,你會有一個不同的,更有見地的視角,這樣的問題贏得了'只是微不足道的,他們會乞求更好的基金會。
+0

它的工作,謝謝! 爲每個屬性調用一個函數是一種很好的做法嗎? (例如,如果我需要獲取用戶名,身份證和Facebook名稱)。它不像一個O(1)操作的吸氣劑,所以我很擔心實時情況下的性能。 – 2014-11-05 15:32:05

+0

我來自6年左右的Java經驗,所以我仍然習慣於功能編程,但是太棒了! – 2014-11-05 15:34:04

+0

@SantiagoIgnacioPoli是的,每個屬性調用一個函數是調用每個屬性的getter的Java等價物。 'lookup(id,Proplist)'直接等同於'proplist.get_id()'。在這種情況下,我們會說「每個元素的調用」或「每個查詢的調用」,因爲它實際上是*發生了什麼,用哪種語言。 – zxq9 2014-11-05 15:50:30