Кодирование json с использованием яда с юникодом

Я использую HTTPoison для получения веб-сайта руководства по эликсиру, а затем анализирую его с помощью Floki для создания преобразователя HTML 2 Jupyter Notebook (с Markdown для описания). Я должен поставить `обратную галочку. \u0060 для подсветки кода, которая работает до сих пор. У меня есть несколько мест, где я использую интерполяцию строк "#{Floki.text(childs_nodes)}", а в других местах Enum.join "" для обработки и преобразования из HTML в Markdown.

Преобразованный результат сохраняется на карте в формате ноутбука Jupyter. Когда я вызываю Poison.encode notebook, я получаю сообщение об ошибке, так как кодовые точки исчезли. Я пробовал разные вещи, но пока не знаю, в чем проблема.

Любые подсказки, что я делаю неправильно при обработке текста? Это исключение:

** (Poison.EncodeError) unable to encode value: {:source, ["Elixir also    provides `Port`, `Reference` and `PID` as data types (usually used in process communication), and we will take a quick look at them when talking about processes. For now, let’s take a look at some of the basic operators that go with our basic types."]}
lib/poison/encoder.ex:377: Poison.Encoder.Any.encode/2
lib/poison/encoder.ex:255: anonymous fn/3 in Poison.Encoder.List.encode/3
lib/poison/encoder.ex:256: Poison.Encoder.List."-encode/3-lists^foldr/2-1-"/3
lib/poison/encoder.ex:256: Poison.Encoder.List.encode/3
lib/poison.ex:41: Poison.encode!/2
(guide2nb) lib/cli.ex:27: CLI.process/1
(elixir) lib/kernel/cli.ex:76: anonymous fn/3 in Kernel.CLI.exec_fun/2

person Rainer Schuster    schedule 02.11.2016    source источник
comment
Значение, которое вы пытаетесь закодировать, выглядит не как карта, а как кортеж. Вставьте сюда исходное значение (и/или код, который пытается его закодировать)   -  person Sheharyar    schedule 02.11.2016
comment
Poison не кодирует кортежи.   -  person Fred the Magic Wonder Dog    schedule 02.11.2016


Ответы (1)


Проблема здесь в том, что вы пытаетесь закодировать Tuple, тогда как Poison работает только с картами и списками. Если бы значение, которое вы пытаетесь закодировать, было бы картой, а не кортежем, оно бы работало идеально. Юникод тут ни при чем.

iex(1)> value = %{source: ["Elixir also    provides `Port`, `Reference` and `PID` as data types (usually used in process communication), and we will take a quick look at them when talking about processes. For now, let’s take a look at some of the basic operators that go with our basic types."]}
iex(2)> Poison.encode(value)
{:ok,
 "{\"source\":[\"Elixir also    provides `Port`, `Reference` and `PID` as data types (usually used in process communication), and we will take a quick look at them when talking about processes. For now, let’s take a look at some of the basic operators that go with our basic types.\"]}"}
person Sheharyar    schedule 03.11.2016
comment
Спасибо за подсказку... Собираюсь рефакторить свой код. На самом деле я использую только карты и списки, но у меня есть несколько flat_maps в рекурсии разбора дерева HTML. Поэтому некоторые из моих карт %{cell_type: :code, metadata: %{}, source: ["0o777"]}, преобразуются в списки ключевых слов с кортежами. [{:cell_type, :markdown}, {:metadata, %{}}, {:source, ["# Basic types"]}, {:cell_type, :markdown}, {:metadata, %{}}, {:source, []}, - person Rainer Schuster; 03.11.2016
comment
Было бы полезно изменить название вопроса, чтобы лучше представить суть проблемы. Это облегчило бы ссылку для других. - person mmartinson; 19.10.2017