mochijson2 или mochijson - PullRequest
       12

mochijson2 или mochijson

7 голосов
/ 13 октября 2009

Я кодирую некоторые данные, используя 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 Ответ

7 голосов
/ 13 октября 2009

Я предполагаю, что решение в mochijson заключается в том, что он рассматривает двоичный файл как строку и обрабатывает список целых чисел как список целых чисел. (Не?) К счастью, строки в Erlang на самом деле представляют собой список целых чисел.

В результате ваш "foo" или, другими словами, ваш [102,111,111] переводится в текст, представляющий "[102,111,111]". Во втором случае ваша строка << "foo" >> становится "foo"

Что касается второго вопроса, mochijson, похоже, всегда возвращает строку, тогда как mochijson2 возвращает тип iodata . Iodata - это, в основном, рекурсивный список строк, двоичных файлов и йод (на самом деле iolists). Если вы намереваетесь только отправить результат «по проводам», эффективнее просто поместить их в список, чем преобразовать их в плоскую строку.

...