0

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

这篇Stackoverflow 帖子很好地介绍了如何使用 mochijson2。我想我可以使用列表推导来浏览 JSON 对象列表。

我坚持的部分是如何在列表理解中删除每个 JSON 对象(或 proplist,如果使用 mochijson2)的键。我可以使用proplists的删除功能。但是在列表理解中尝试这样做时我没有成功。

这是上下文的一些代码:

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),

任何用代码说明的建议都非常感谢。

4

1 回答 1

3

您可以使用 lists: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\"}]">>

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

于 2010-10-08T11:59:19.207 回答