elixir - 使用 Poison 将映射编码为 json 时对键进行排序

标签 elixir elixir-poison

出于阅读目的,我希望在 json 文件中添加特定的按键顺序。

我知道 map 的键没有任何顺序,所以我们不应该依赖它,但由于 Poison 无法对 Prop 列表进行编码,我不知道如何做到这一点。

iex(1)> %{from: "EUR", to: "USD", rate: 0.845} |> Poison.encode!
"{\"to\":\"USD\",\"rate\":0.845,\"from\":\"EUR\"}"

我想要的结果是:

"{\"from\":\"EUR\", \"to\":\"USD\", \"rate\":0.845}"

我应该使用哪种结构才能通过 Poison 实现此目的?

最佳答案

您确定要这样做吗?也许最不坏的方法是为你的映射定义一个结构,然后为该结构实现 Poison 编码协议(protocol)。

它可能看起来像这样......

defmodule Currency do
    defstruct from: "", to: "", rate: 0
end

然后在项目中的某个地方实现该协议(protocol)

defimpl Poison.Encoder, for: Currency do
  def encode(%Currency{from: from, to: to, rate: rate}, _options) do
    """
      {"from": #{from}, "to": #{to}, "rate": #{rate}}
    """
  end
end

然后

Poison.encode!(%Currency{from: "USD", to: "EUR", rate: .845})

话虽如此,我真的非常建议不要这样做。有序映射始终是一个糟糕的主意,并且会导致一些非常脆弱且令人困惑的行为。

考虑使用实际排序的内容,例如列表列表

关于elixir - 使用 Poison 将映射编码为 json 时对键进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37457131/

相关文章:

sorting - Elixir 如何对列表理解进行排序?

elixir - Ecto 相当于 Rails 的acts_as_list?

ruby - 如何像 Ruby 的线程一样等待 Elixir 生成的进程结束#join

elixir - Windows - Elixir 'mix' 在 iex 解释器中未定义

elixir - 删除链接不起作用 Phoenix

elixir - 毒药无法编码错误消息

elixir - 带有粗箭头与冒号的 map (Poison - json 解码)

javascript - 从 XMLHttpRequest 检索响应负载元素

elixir - 在 Elixir 中映射 JSON 值