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