5

いくつかのJSONデータを持つ変数があります:

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

mochijson2を使用して、データをデコードします。

 Struct = mochijson2:decode(A). 

そして今、私はこれを持っています:

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

(たとえば)「job」または「id」を読み込もうとしています。

struct.get_valueを使用してみましたが、機能しないようです。

何か案は?

4

5 に答える 5

13

データは{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をご覧ください。

于 2010-04-29T20:12:20.203 に答える
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.

使用法:

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から値を抽出するのがこれ以上簡単になるとは思いません。

于 2012-11-29T20:28:24.347 に答える
2

データにアクセスする別の方法を次に示します。使いやすさのためにレコード構文を使用します。

-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を使用する場合のもう1つのオプション。私は個人的にこの構文の方が好きです。

于 2012-08-18T08:20:01.503 に答える
1

前に与えられた答えに加えて、mochiweb、json(ビデオ)に関する素晴らしいチュートリアルもあります。

于 2010-04-30T01:35:25.070 に答える
1

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.

これには、特に予期しない形になる可能性のある受信データを処理する場合に多くの利点があります。

于 2016-09-22T13:50:46.773 に答える