mochijson2 или mochijson
Я кодирую некоторые данные, используя mochijson2. Но я обнаружил, что он ведет себя странно в строках в виде списков.
Пример:
mochijson2: закодировать ("Foo").
[91, "102", 44, "111", 44, "111", 93]
Где "102", "111", "111" - это $f, $o, $o, закодированные как строки 44, - это запятые, а 91 и 93 - квадратные скобки.
Конечно, если я выведу это куда-нибудь, я получу строку "[102,111,111]", которая явно не та, что я что.
Если я попробую
mochijson2: закодировать (<< "Foo" >>).
[34,<< "Foo" >>,34]
Итак, я снова получаю список из двух двойных кавычек и двоичной части, которые можно перевести в двоичную форму с помощью list_to_binary/1
Вот вопрос - почему это так противоречиво. Я понимаю, что существует проблема с удалением списка erlang, который должен быть закодирован как массив json, и строки erlang, которая должна быть закодирована как строка json, но, по крайней мере, может ли он выводить двоичный файл, когда я передаю его в двоичном виде?
И второй вопрос: похоже, что mochijson выводит все красиво (потому что он использует специальный кортеж для обозначения массивов {array,...})
mochijson: закодировать (<< "Foo" >>).
"\" Foo\""
В чем разница между mochijson2 и mochijson? Спектакль? Обработка Юникода? Что-нибудь еще?
Спасибо
1 ответ
Я думаю, что решение в mochijson заключается в том, что он рассматривает двоичный файл как строку, а список целых чисел рассматривает как список целых чисел. (Не?) К счастью, строки в Erlang на самом деле представляют собой список целых чисел.
В результате ваш "foo" или, другими словами, ваш [102,111,111] переводится в текст, представляющий "[102,111,111]". Во втором случае ваша строка << "foo" >> становится "foo"
Что касается второго вопроса, кажется, что mochijson всегда возвращает строку, тогда как mochijson2 возвращает тип iodata. Iodata - это в основном рекурсивный список строк, двоичных файлов и йод (на самом деле iolists). Если вы намереваетесь только отправить результат "по проводам", эффективнее просто поместить их в список, чем преобразовать их в плоскую строку.