我有一个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),
任何以代码说明的建议都非常受欢迎。
答案 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/