Как использовать 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.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"}]}} ]}.
Вложенные структуры должны иметь тот же стиль "struct", что и объект верхнего уровня.