【问题标题】:Ordering keys when encoding a map to json with Poison使用 Poison 将地图编码为 json 时排序键
【发布时间】:2016-09-24 05:42:56
【问题描述】:

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

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

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 实现这一点?

【问题讨论】:

    标签: elixir elixir-poison


    【解决方案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})
    

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

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

    【讨论】:

    • 某种意义上我也有这个要求。我们将大量微小的 JSON 对象(刻度数据)存储在纯文本文件中。通过以某种方式对字段进行排序,无需对 JSON 进行解包/解码即可对刻度数据进行排序,从而节省了大量的处理能力,并且还可以对编码数据使用简单的字符串比较。但大多数情况下,我会同意你的看法,可能不应该轻易完成。
    猜你喜欢
    • 1970-01-01
    • 2016-11-19
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多