فك تشفير JSON مع Mochijson2 في إرلانج
-
02-10-2019 - |
سؤال
لدي var التي لديها بعض بيانات JSON:
A = <<"{\"job\": {\"id\": \"1\"}}">>.
باستخدام Mochijson2 ، أقوم بفك تشفير البيانات:
Struct = mochijson2:decode(A).
والآن لدي هذا:
{struct,[{<<"job">>,{struct,[{<<"id">>,<<"1">>}]}}]}
أحاول قراءة (على سبيل المثال) أو "Job" أو "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.
هذا له العديد من المزايا خاصة عند العمل مع البيانات الواردة التي يمكن أن يكون لها شكل غير متوقع.