Erlang:JSON列表到JSON列表

时间:2010-10-08 10:57:46

标签: json erlang mochijson2

我有一个JSON对象列表(从nosql db接收),并希望删除或重命名某些键。然后我想再次将数据作为JSON对象列表返回。

这个Stackoverflow post提供了如何使用mochijson2的良好感觉。我想我可以使用list comprehension来浏览JSON对象列表。

我坚持的部分是如何在列表理解中删除每个JSON对象的密钥(或者如果使用mochijson2,则为proplist)。我可以使用delete function的支持者。但是当我在列表理解中尝试这样做时,我没有成功。

以下是上下文的位代码:

A = <<"[{\"id\": \"0129\", \"name\": \"joe\", \"photo\": \"joe.jpg\"  }, {\"id\": \"0759\", \"name\": \"jane\", \"photo\": \"jane.jpg\"  }, {\"id\": \"0929\", \"name\": \"john\", \"photo\": \"john.jpg\" }]">>. 
Struct = mochijson2:decode(A). 
{struct, JsonData} = Struct,
{struct, Id} = proplists:get_value(<<"id">>, JsonData),

任何以代码说明的建议都非常受欢迎。

1 个答案:

答案 0 :(得分:3)

您可以使用list:keydelete(Key,N,TupleList)返回删除了某些元组的新元组列表。所以在列表理解中,为每个条目提取元组列表(或支持者),并创建一个删除了密钥的新结构:

B = [{struct, lists:keydelete(<<"name">>, 1, Props)} || {struct, Props} <- Struct].

给出:

[{struct,[{<<"id">>,<<"0129">>},
          {<<"photo">>,<<"joe.jpg">>}]},
 {struct,[{<<"id">>,<<"0759">>},
          {<<"photo">>,<<"jane.jpg">>}]},
 {struct,[{<<"id">>,<<"0929">>},
          {<<"photo">>,<<"john.jpg">>}]}]

iolist_to_binary(mochijson2:encode(B)).

给出:

<<"[{\"id\":\"0129\",\"photo\":\"joe.jpg\"},{\"id\":\"0759\",\"photo\":\"jane.jpg\"},{\"id\":\"0929\",\"photo\":\"john.jpg\"}]">>

顺便说一句,使用lists / * tuple列表函数要快得多,但有时候比proplists / *函数稍微不方便:http://sergioveiga.com/index.php/2010/05/14/erlang-listskeyfind-vs-proplistsget_value/