在Erlang中使用mochijson2解码JSON

Jon*_*ero 5 erlang json mochiweb mochijson2

我有一个包含一些JSON数据的var:

A = <<"{\"job\": {\"id\": \"1\"}}">>. 
Run Code Online (Sandbox Code Playgroud)

使用mochijson2,我解码数据:

 Struct = mochijson2:decode(A). 
Run Code Online (Sandbox Code Playgroud)

现在我有了这个:

{struct,[{<<"job">>,{struct,[{<<"id">>,<<"1">>}]}}]}
Run Code Online (Sandbox Code Playgroud)

我试图阅读(例如),"工作"或"id".

我尝试使用struct.get_value但它似乎不起作用.

有任何想法吗?

小智 13

数据采用{struct,proplist()}格式,所以这就是你要做的:

{struct, JsonData} = Struct,
{struct, Job} = proplists:get_value(<<"job">>, JsonData),
Id = proplists:get_value(<<"id">>, Job),
Run Code Online (Sandbox Code Playgroud)

您可以在http://www.erlang.org/doc/man/proplists.html上阅读有关支持者的更多信息


yet*_*ehe 5

另一个访问json结构的辅助函数:

jsonobj({struct,List}) ->
    fun({contains,Key}) ->
        lists:keymember(Key,1,List);
    ({raw,Key}) ->
        {_,Ret} = lists:keyfind(Key,1,List),Ret;
    (Key) ->
        {_,Ret} = lists:keyfind(Key,1,List),
        jsonobj(Ret)
    end;
jsonobj(List) when is_list(List) ->
    fun(len) ->
        length(List);
    (Index) ->
        jsonobj(lists:nth(Index,List))
    end;
jsonobj(Obj) -> Obj.
Run Code Online (Sandbox Code Playgroud)

用法:

1> A=mochijson2:decode(<<"{\"job\": {\"id\": \"1\", \"ids\": [4,5,6], \"isok\": true}}">>).
2> B=jsonobj(A).
3> B(<<"job">>).
#Fun<jsonutils.1.33002110>
4> (B(<<"job">>))(<<"id">>).
1
5> (B(<<"job">>))(<<"ids">>).
#Fun<jsonutils.1.9495087>
6> (B(<<"job">>))({raw,<<"ids">>}).
[4,5,6]
7> ((B(<<"job">>))(<<"ids">>))(1).
4
8> B({raw,<<"job">>}).
{struct,[{<<"id">>,<<"1">>},
               {<<"ids">>,[1,2,3]},
               {<<"isok">>,true}]}
9> B({contains,<<"job">>}).
true
10> B({contains,<<"something">>}).
false
11> ((B(<<"job">>))(<<"ids">>))(len)
3
Run Code Online (Sandbox Code Playgroud)

我不认为从json中提取值可以更简单.