Кодирование карт Erlang как JSON со строками для анализа с помощью Javascript?

Я пытаюсь взять карту Erlang, например

#{"breakfast" => "leftovers"}

и закодировать как карту JSON.

Например, я попытался преобразовать список с помощью jiffy.

([email protected])27> binary_to_list(jiffy:encode(["alpha", "beta"] )).
"[[97,108,112,104,97],[98,101,116,97]]"

но я не уверен, как преобразовать это в объект JSON.

Когда я пытаюсь преобразовать карту, я получаю "invalid_member_key"

([email protected])28> jiffy:encode(#{"breakfast" => "egg sandwhich"}).
** exception throw: {error,{invalid_object_member_key,"breakfast"}}
     in function  jiffy:encode/2 (src/jiffy.erl, line 97)

Я попробовал красивое средство форматирования для списка, и я получаю новые строки

([email protected])31> binary_to_list(jiffy:encode(["alpha", "beta"], [pretty] )).
"[\n  [\n    97,\n    108,\n    112,\n    104,\n    97\n  ],\n  [\n    98,\n    101,\n    116,\n    97\n  ]\n]"

Почему это не работает? json_object это

-type json_object() :: {[{json_string(),json_value()}]}
                        | #{json_string() => json_value()}.

поэтому я ожидаю, что преобразование карты сработает. Я пробовал искать и нашел примеры чтения JSON, но не рабочий пример преобразования Erlang в читаемый JSON.


person quantumpotato    schedule 04.02.2017    source источник


Ответы (1)


Проблема в том, что в Erlang строка "hello" — это просто список целых чисел. Библиотеки, которые кодируют карты Erlang в JSON, интерпретируют строки как списки JSON, поэтому на выходе вы получаете список целых чисел.

Чтобы получить строки JSON, вам нужно использовать двоичные файлы Erlang в качестве значений в ваших картах:

Food = #{<<"breakfast">> => <<"leftovers">>},
jiffy:encode(Food).
%%= <<"{ \"breakfast\" : \"leftovers\" }">>

jiffy согласован, поэтому он также будет декодировать строки JSON как двоичные файлы Erlang, что необходимо учитывать при использовании jiffy:decode/1.

person juan.facorro    schedule 05.02.2017