2016-10-29 13 views
0

「earTest:input( "hai"、 "1"、 "0.1")を実行すると、次のエラーが発生します。 erlangシェルで。あなたは私を助けてくれますか?(私のエンコード/デコードの問題?)ERLANG JSONデコードエラー

** exception error: no function clause matching xmerl_ucs:expand_utf8_1(
    {obj,[{data,[{obj,[{"name","hai"}, 
    {"number","1"}, 
    {"marks","0.1"}]}]}]}, 
    [],0 
) (xmerl_ucs.erl, line 435) 

in function xmerl_ucs:from_utf8/1 (xmerl_ucs.erl, line 183) 
in call from rfc4627:unicode_decode/1 (rfc4627.erl, line 323) 
in call from rfc4627:decode/1 (rfc4627.erl, line 258) 
in call from erlTest:outputJ/1 (erlTest.erl, line 10) 

コード:

-module(earTest). 
-export([input/3]). 
-import(rfc4627,[encode/1, decode/1]). 

outputJ(X) -> 
    {ok, Json, _} = rfc4627:decode(X), 
    Airport = rfc4627:get_field(Json, "name", <<>>), 
    Airport. 

input(X,Y,Z) -> 
    Data = [{obj,[{"name",X},{"number",Y},{"marks",Z}]}], 
    JsonData = {obj, [{data, Data}]}, 
    rfc4627:encode(JsonData), 
    outputJ(JsonData). 
+0

入力(X、Y、Z)によって置き換える - >データ= [{OBJ、[{ "名前"、X}、{ "ナンバー"、Y}、{ "マーク"、 Z}]}]、 JsonData = {obj、[{data、Data}]}、rfc4627:encode(JsonData)、 outputJ(JsonData)。 – murty

+0

データがエンコードされた後に "input"関数から "outputJ(X)"関数が呼び出されています...私はエンコードとデコードを実行したいと思います。内容を検索するにはどうしたらいいですか? ) – murty

答えて

1

あなたは非エンコードされたJSONをデコードしようとしている、とあなたは入れ子構造を作成しました。

-module(earTest). 
-export([input/3]). 
-import(rfc4627,[encode/1, decode/1]). 

outputJ(X) -> 
    {ok, Json, _} = rfc4627:decode(X), 
    [Inner_obj] = rfc4627:get_field(Json, "data", <<>>), % extract the inner object 
    Airport = rfc4627:get_field(Inner_obj, "name", <<>>), 
    Airport. 

input(X,Y,Z) -> 
    % Here you are creating a list of one single object element 
    Data = [{obj,[{"name",X},{"number",Y},{"marks",Z}]}], 
    % and you put it in a "container" object, in the data field 
    JsonData = {obj, [{data, Data}]}, 
    % you have to reuse the result of encoding in the decode function! 
    Res = rfc4627:encode(JsonData), 
    outputJ(Res). 
+0

ありがとうございます。でも、ランタイムエラーが発生しています。 13> c(earTest)。 {ok、earTest} 14> earTest:入力( "123"、 "345"、 "678")。 **例外エラー:右側の値の一致なし<<>> function earTest:outputJ/1(earTest.erl、line 7) 行7:[Inner_obj] = rfc4627:get_field(Json、 "Data"、<<> >)、%内部オブジェクトを抽出してください – murty

+0

ありがとうCHARLIE、私は "データ"を "データ"に変更した後に動作します。 [Inner_obj] = rfc4627:get_field(Json、 "data"、<<>>) – murty

+0

オススメのため申し訳ありませんが、送信する前にコードをテストしませんでした。私は正しい答えを編集します。 – Pascal

関連する問題