Frage

Ich habe eine var, die einige JSON-Daten hat:

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

Mit mochijson2, dekodieren ich die Daten:

 Struct = mochijson2:decode(A). 

Und jetzt habe ich dies:

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

Ich versuche, (zum Beispiel) zu lesen, "Job" oder "id".

Ich habe versucht, struct.get_value verwenden, aber es scheint nicht zu arbeiten.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Die Daten sind in {struct, proplist ()} Format, also hier ist was Sie tun:

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

Sie können mehr über Maker proplists bei lesen: http://www.erlang.org/ doc / man / proplists.html

Andere Tipps

Eine weitere Hilfsfunktion für den Zugriff json Struktur:

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.

Verbrauch:

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

Ich glaube nicht, Werte von Json Extraktion kann jede einfacher sein.

Hier ist ein weiteres Verfahren zur Herstellung der Zugriff auf die Daten. Uses zeichnet Syntax für einfache Bedienung.

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

tut genau dasselbe wie die Antwort, anstatt mit Aufzeichnungen. Nur eine weitere Option, wenn mochijson2 verwenden. Ich persönlich mag diese Syntax besser.

Zusätzlich zu der Antwort früher gibt es auch eine schöne Tutorial auf mochiweb, json (Video).

Meine Lieblings-Weg mochijson Daten von handeling ersetzt alle die Struktur mit Hash enden Karten nach dem sie sauber Muster angepasst werden kann. Um dies zu tun ich diese einfach schrieb Funktion zu verstehen:

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.

Hier ist ein Beispiel dafür, wie man es benutzt:

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

Dies hat besonders viele Vorteile, wenn sie mit eingehenden Daten arbeiten, die eine unerwartete Form aufweist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top