簡體   English   中英

在Erlang中使用mochijson2解碼JSON

[英]Decode JSON with mochijson2 in Erlang

我有一個包含一些JSON數據的var:

A = <<"{\"job\": {\"id\": \"1\"}}">>. 

使用mochijson2,我解碼數據:

 Struct = mochijson2:decode(A). 

現在我有了這個:

{struct,[{<<"job">>,{struct,[{<<"id">>,<<"1">>}]}}]}

我想讀(例如),“工作”或“id”。

我嘗試使用struct.get_value但它似乎不起作用。

有任何想法嗎?

數據采用{struct,proplist()}格式,所以這就是你要做的:

{struct, JsonData} = Struct,
{struct, Job} = proplists:get_value(<<"job">>, JsonData),
Id = proplists:get_value(<<"id">>, Job),

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

另一個訪問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.

用法:

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

我不認為從json中提取值可以更簡單。

這是另一種訪問數據的方法。 使用記錄語法以方便使用。

-record(struct, {lst=[]}).

A = <<"{\"job\": {\"id\": \"1\"}}">>,
Struct = mochijson2:decode(A), 
Job = proplists:get_value(<<"job">>, Struct#struct.lst),
Id = proplists:get_value(<<"id">>, Job#struct.lst),

與使用記錄的答案完全相同。 使用mochijson2時的另一個選擇。 我個人更喜歡這種語法。

添加到前面給出的答案還有一個關於mochiweb,json(視頻)的精彩教程

我最喜歡使用mochijson數據的方法是用哈希映射替換所有結構,之后它們可以干凈地模式匹配。 為此,我寫了這個易於理解的功能:

structs_to_maps({struct, Props}) when is_list(Props) ->
    lists:foldl(
        fun({Key, Val}, Map) ->
            Map#{Key => structs_to_maps(Val)}
        end,
        #{},
        Props
    );
structs_to_maps(Vals) when is_list(Vals) ->
    lists:map(
        fun(Val) ->
            structs_to_maps(Val)
        end,
        Vals
    );
structs_to_maps(Val) ->
    Val.

以下是如何使用它的示例:

do() ->
    A = <<"{\"job\": {\"id\": \"1\"}}">>,
    Data = structs_to_maps(mochijson2:decode(A)),
    #{<<"job">> := #{<<"id">> := Id}} = Data,
    Id.

這具有許多優點,尤其是在處理可能具有意外形狀的傳入數據時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM