2010-10-08 62 views
0

我有一个JSON对象列表(从nosql数据库接收到)并且想要删除或重命名某些键。然后我想再次将数据作为JSON对象列表返回。Erlang:JSON列表到JSON列表

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

我坚持的部分是如何在列表理解中为每个JSON对象(或proplist,如果使用mochijson2)删除键。我可以使用proplists的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), 

与代码示出任何建议十分赞赏。

+0

我应该是A = <<“[{\”id \“:\ “0129 \”,\“name \”:\“joe \”,\“photo \”:\“joe.jpg \”},{\“id \”:\“0759 \”,\“name \ :\“jane \”,\“photo \”:\“jane.jpg \”},{\“id \”:\“0929 \”,\“name \”:\“john \”,\“photo \“:\”john.jpg \“}]”>>。 – bjnortier 2010-10-08 12:00:02

+0

谢谢...绝对正确。 – 2010-10-08 12:05:23

回答

3

您可以使用列表:keydelete(Key,N,TupleList)返回删除了某些元组的新元组列表。因此,在列表理解,每个条目提取元组列表(或proplists),并创建与删除键的新结构:

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\"}]">> 

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