【问题标题】:elixir Poison data type parse Json dataelixir Poison 数据类型解析 Json 数据
【发布时间】:2017-05-11 10:55:46
【问题描述】:

我是elixir的新手,很抱歉,我相信这很简单。

我可以找到有关遵循此模式的数据类型的任何信息:

%{"quoted_string" => "string_w_quotes"}

这叫什么?

这是我遇到的问题。我正在使用 HTTPoison 和 Poison。我调用 Get 请求并成功获得 JSON 响应,然后将整个响应通过管道传递给 Poison。然后我在模式上匹配给我的药水。我试图达到我可以说body.address 的地步,但我得到了一个错误。

以下是相关代码:

# after call
...
body
|> Poison.decode!
|> case do
  {:ok, %HTTPoison.Response{body: body}} ->
    IO.puts "response received"
    body.address
...

然后它打印这个:

...收到响应 ** (KeyError) key :address not found in: %{"address" => "123", "public" => "abc"} ...

所以我想我真正的问题是我该如何转

%{"address" => "123", "public" => "abc"}

进入

%{:address => "123", :public => "abc"}

这样我就可以成功使用这个了:

body.address

对吗?

【问题讨论】:

  • 将字符串从互联网转换为原子是个坏主意。原子不是垃圾收集的。因此,请使用您在下面发现的 body["address"] 方法。但是,要回答您的问题Enum.map(params, fn {key, value} -> {String.to_atom(key), value} end) |> Enum.into(%{})。但不要这样做:)

标签: json elixir


【解决方案1】:

它是一个带有二进制键的映射。

body.address 是访问映射中原子键的缩写。但是,如果密钥不存在,它就不起作用。您最好使用body[:address],如果地图没有密钥,它将返回 nil。

对于二进制密钥,您可以使用body["address"] 来访问结构。或者,您可以使用Map.get(body, "address")

【讨论】:

  • 感谢您提供的信息,它也帮助我解决了相关问题!我能够删除 (keys: :atoms!) 并改用 body["address"] 调用它。
【解决方案2】:

修改代码如下:

    |> Poison.decode!(keys: :atoms!)

这告诉 Poison 我想要将键作为原子。

【讨论】:

  • 我将把答案留在那里,因为我解释了模式以及它失败的原因。我不建议使用 . 符号来访问映射,除非您希望它在密钥不存在时引发异常。
猜你喜欢
  • 2018-05-13
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 2014-05-29
  • 2017-08-25
相关资源
最近更新 更多