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

The*_*uad 7 elixir elixir-poison

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

我知道地图的密钥没有任何顺序,然后我们不应该依赖它,但由于Poison无法编码支持者,我不知道如何做到这一点.

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

我想要的结果是:

"{\"from\":\"EUR\", \"to\":\"USD\", \"rate\":0.845}"
Run Code Online (Sandbox Code Playgroud)

我应该使用哪种结构来实现毒药?

roz*_*zap 2

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

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

defmodule Currency do
    defstruct from: "", to: "", rate: 0
end
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

进而

Poison.encode!(%Currency{from: "USD", to: "EUR", rate: .845})
Run Code Online (Sandbox Code Playgroud)

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

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