яд эликсира не способен расшифровать JSON - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь использовать код ниже

data = Poison.decode!(payload)
    |> ProperCase.to_snake_case
Logger.info("data is #{data}")

Где данные находятся в очереди сообщений

    {
      "name":"Joe",
      "id": "13",
      "version": 0
    }

При этом я получаю сообщение об ошибке

[error] Could not process PerfectFlight: %Protocol.UndefinedError{description: "", protocol: String.Chars, value: %{"id" => "13", "name" => "Joe", "version" => 0}}

Однако, Если я изменю свой входной сигнал json на

 "{
  \"name\":\"Joe\",
  \"id\": \"13\",
  \"version\": 0
}"

Poison.decode() работает прекрасно.Теперь проблема в том, что я не хочу менять свой ввод JSON по многим причинам.Чего мне не хватает?

Редактировать : код не сработал не при декодировании, а на следующей строке Logger.info("data is #{data}").Поскольку вывод функции decode не является String, я должен использовать IO.inspect, как показано ниже.Принятие ответа Адамса за его уверенность в функции декодирования.

data = Poison.decode!(payload)
    |> ProperCase.to_snake_case
IO.inspect(data)

1 Ответ

0 голосов
/ 22 октября 2018

В Poison нет ничего плохого:

iex(1)> Poison.decode!(~S'{"name":"Joe", "id": "13", "version": 0}')
%{"id" => "13", "name" => "Joe", "version" => 0}

Ваш пример также работает для меня:

iex(1)> payload = ~S'{"name":"Joe", "id": "13", "version": 0}'
"{\"name\":\"Joe\", \"id\": \"13\", \"version\": 0}"
iex(2)> Poison.decode!(payload) |> ProperCase.to_snake_case
%{"id" => "13", "name" => "Joe", "version" => 0}

Возможно, вы получаете ошибку, потому что что-то где-то пытается преобразоватьсопоставить со строкой:

iex(1)> IO.puts %{"id" => "13", "name" => "Joe", "version" => 0}
** (Protocol.UndefinedError) protocol String.Chars not implemented for %{"id" => "13", "name" => "Joe", "version" => 0}

Похоже, вы получаете ошибку при попытке отладить вашу проблему.Вы можете использовать IO.inspect вместо IO.puts для отладки и посмотреть, сможете ли вы получить более полезное сообщение об ошибке.

...