2016-08-27 9 views
0

Erlangの初心者はこちらです。このような てきたJSON:Erlang構造体の名前で値を取得するには?

{ 
"ReadCardResultResult":{ 
    "amount":"0", 
    "balance":"9400", 
    "Status":1, 
    "Commands":[ 

    ], 
    "message":"0000000000000000", 
    "ret":{ 
    "code":0, 
    "desc":"SUCCESS", 
    "subReturn":null 
    }, 
    "transactionId":103979, 
    "txnInfo":[ 
    { 
     "infoId":101, 
     "infoName":"TestName1", 
     "infoValue":"04432FBAA53080" 
    }, 
    { 
     "infoId":102, 
     "infoName":"TestName2", 
     "infoValue":"" 
    }, 
    { 
     "infoId":103, 
     "infoName":"TestName3", 
     "infoValue":"9400" 
    }, 
    { 
     "infoId":104, 
     "infoName":"TestName4", 
     "infoValue":"5" 
    } 
    ] 
} 
} 

私の仕事は、infoNameに応じtxnInfoのうちの特定のinfoValueを取得することです。たとえば、infoValueを "TestName3"、つまり "9400"にする必要があります。

は、これまでのところ私はproplists:get_value(<<"txnInfo">>, ReadCardResultResult).でJSONを狭くし、今私はこれを持っている:

[{struct,[{<<"infoId">>,101}, 
     {<<"infoName">>,<<"TestName1">>}, 
     {<<"infoValue">>,<<"043A2FBAA53080">>}]}, 
{struct,[{<<"infoId">>,108}, 
     {<<"infoName">>,<<"TestName2">>}, 
     {<<"infoValue">>,<<"772">>}]}, 
{struct,[{<<"infoId">>,108}, 
     {<<"infoName">>,<<"TestName3">>}, 
     {<<"infoValue">>,<<"772">>}]}, 
{struct,[{<<"infoId">>,125}, 
     {<<"infoName">>,<<"TestName4">>}, 
     {<<"infoValue">>,<<>>}]}] 

、どこ私はここから行くのですか?私は本当にこれに固執しています。どんな助けもありがとう。

+0

この2番目のスニペットは、最初のスニペットのJSONからのものではないようです。データは異なります。 – Dogbert

+0

@Dogbert私はmochijson2を使用し、2番目のスニペットを返します –

+0

そうではありません。値は異なっていました(それでもすべてが正しいわけではありません)。とにかく、私は '' TestName3 ''のデータを修正し、答えを投稿しました。 – Dogbert

答えて

1

述語に一致するリストの最初の項目を効率的に取得するには、述語を逆転させてlists:dropwhile/2を使用します(詳細はthis答えを参照してください)。それ以外は、それだけでいくつかのパターンマッチングとcase表現です:

-module(a). 
-compile([export_all]). 

main() -> 
    TxnInfo = [{struct,[{<<"infoId">>,101}, 
     {<<"infoName">>,<<"TestName1">>}, 
     {<<"infoValue">>,<<"043A2FBAA53080">>}]}, 
    {struct,[{<<"infoId">>,108}, 
     {<<"infoName">>,<<"TestName2">>}, 
     {<<"infoValue">>,<<"772">>}]}, 
    {struct,[{<<"infoId">>,108}, 
     {<<"infoName">>,<<"TestName3">>}, 
     {<<"infoValue">>,<<"9400">>}]}, 
    {struct,[{<<"infoId">>,125}, 
     {<<"infoName">>,<<"TestName4">>}, 
     {<<"infoValue">>,<<>>}]}], 
    WantName = <<"TestName3">>, 
    case lists:dropwhile(fun({struct, PropList}) -> proplists:get_value(<<"infoName">>, PropList) /= WantName end, TxnInfo) of 
    [] -> 
     io:format("no matches~n"); 
    [{struct, PropList} | _] -> 
     io:format("first match: ~p~n", [proplists:get_value(<<"infoValue">>, PropList)]) 
    end. 

は出力:

first match: <<"9400">> 

あなただけの最初の結果を気にし、見つからなかった場合にクラッシュする場合は、交換することができますcaseとちょうど:

[{struct, PropList} | _] = lists:dropwhile(...), 
+0

すばらしい解決策。ありがとう、男! –

関連する問題