簡體   English   中英

長生不老葯毒液無法解碼JSON

[英]elixir poison not able to decode JSON

我正在嘗試下面的代碼

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

有效負載來自Messging Queue

    {
      "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)

毒葯沒有錯:

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進行調試,並查看是否可以獲得更有用的錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM