【问题标题】:elixir poison not able to decode JSON长生不老药无法解码 JSON
【发布时间】:2018-10-23 17:04:49
【问题描述】:

我正在尝试下面的代码

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)

【问题讨论】:

  • 旁注: 使用以下术语开始管道:payload |> Poison.decode!() |> ProperCase.to_snake_case()

标签: json elixir decode elixir-poison


【解决方案1】:

毒药没有错:

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

【讨论】:

  • 那些额外的单引号的区别。这是我正在尝试的Poison.decode!({"name":"Joe", "id": "13", "version": 0})。这就是来自Messaging Queuepayload 消息的发送方式。
  • @veer7 这是不可能的,因为 JSON 不是有效的长生不老药语法。你会得到SyntaxError,而不是Protocol.UndefinedError
  • 我让你引用 JSON,然后在尝试使用 IO.puts 记录成功解析的结果地图时遇到错误。
  • 正确!这是Poison.decode!({"name":"Joe", "id": "13", "version": 0}) 的语法错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2018-01-13
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多