كيفية استخدام Mochijson لتشفير هيكل البيانات في Erlang؟
سؤال
أنا أستخدم mochiweb وأنا لا أعرف كيفية استخدام تشفير JSON في التعامل مع هيكل البيانات المعقدة. ما هي الاختلافات بين mochijson و mochijson2؟ هل هناك أي مثال جيد؟ أحصل دائما على الأخطاء التالية:
46> T6={struct,[{hello,"asdf"},{from,"1"},{to,{a,"aa"}}]}.
{struct,[{hello,"asdf"},{from,"1"},{to,{a,"aa"}}]}
47> mochijson2:encode(T6).
** exception exit: {json_encode,{bad_term,{a,"aa"}}}
in function mochijson2:json_encode/2
in call from mochijson2:'-json_encode_proplist/2-fun-0-'/3
in call from lists:foldl/3
in call from mochijson2:json_encode_proplist/2
39> T3={struct,[{hello,"asdf"},{[{from,"1"},{to,"2"}]}]}.
{struct,[{hello,"asdf"},{[{from,"1"},{to,"2"}]}]}
40> mochijson:encode(T3).
** exception error: no function clause matching mochijson:'-json_encode_proplist/2-fun-0-'({[{from,"1"},{to,"2"}]},
[44,"\"asdf\"",58,"\"hello\"",123],
{encoder,unicode,null})
in function lists:foldl/3
in call from mochijson:json_encode_proplist/2
المحلول
يعمل Mochijson2 مع سلاسل ثنائيات، قوائم كصفيفات، وفتح فقط UTF-8. Decodes Mochijson ويزفص نقاط رمز Unicode.
لإنشاء بنية عميقة فعلت ما يلي:
2> L = {struct, [{key2, [192]}]}.
{struct,[{key2,"?"}]}
3>
3> L2 = {struct, [{key, L}]}.
{struct,[{key,{struct,[{key2,"?"}]}}]}
4>
4> mochijson:encode(L2).
[123,"\"key\"",58,
[123,"\"key2\"",58,[34,"\\u00c0",34],125],
125]
لذلك إذا قمت بإنشاء بنية البيانات بشكل متكرر باستخدام قوائم، فستكون على ما يرام. لست متأكدا من عدم دعم الهياكل العميقة، لكن لا يبدو أنها لا تكون، على الأقل ليست الطريقة التي تحاول خلقها. ربما يعرف شخص آخر طريقة أكثر ذكاء للقيام بذلك.
يمكنك أيضا التحقق من هذا الموضوع: أمثلة mochijson2!
أو
نصائح أخرى
T6={struct, [{hello,"asdf"},{from,"1"},{to, {a,"aa"}} ]}.
يجب أن يكون بدلا من ذلك:
T6={struct, [{hello,"asdf"},{from,"1"},{to, {struct, [{a,"aa"}]}} ]}.
تحتاج الهياكل المتداخلة إلى أن يكون لها نمط "الهيكل" نفسه ككائن المستوى الأعلى.