0

我正在尝试下面的代码

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 如下。接受 Adams 对解码功能的信心的回答。

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

1 回答 1

4

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进行调试,看看是否可以获得更有用的错误消息。

于 2018-10-22T13:42:00.843 回答