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



出于阅读目的,我想在json文件中有一个特定的键顺序。

我知道地图的键没有任何顺序,那么我们不应该依赖它,但由于 Poison 无法编码道具,我不知道该怎么做。

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 编码协议。

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

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

然后在项目中的某个地方实现协议

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})

话虽如此,我真的非常非常建议不要这样做。有序地图总是一个糟糕的主意,并导致一些非常脆弱和混乱的行为。

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

最新更新