7

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

我知道 map 的键没有任何顺序,所以我们不应该依赖它,但是由于 Poison 无法编码 proplists,我不知道该怎么做。

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 实现这一点,我应该使用哪种结构?

4

1 回答 1

1

你确定要这么做吗?可能最不坏的方法是为您的地图定义一个结构,然后为该结构实现毒药编码协议。

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

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

话虽如此,我真的,真的建议不要这样做。有序地图总是一个糟糕的想法,并导致一些非常脆弱和令人困惑的行为。

考虑使用实际排序的东西,比如列表列表

于 2016-07-20T17:13:13.567 回答