使用Poison将地图编码为json时的顺序键

时间:2016-05-26 09:44:02

标签: elixir elixir-poison

出于阅读目的,我希望在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?

1 个答案:

答案 0 :(得分:1)

你确定要这么做吗?可能最不好的方法是为您的地图定义一个结构,然后为该结构实现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})

所有这一切,我真的,真的建议不要这样做。有序地图总是一个可怕的想法,并导致一些非常脆弱和混乱的行为。

考虑使用实际订购的内容,例如列表列表