2016-05-26 1 views
6

jsonファイルに特定のキーオーダーをしたいと思います。毒を使って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}" 

答えて

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

は、それが言われているすべてのプロトコルを実装し、I本当に、これに反対するのは本当にお勧めです。順序付けされた地図は常にひどいアイデアであり、本当に脆弱で混乱する行動につながります。

実際に注文されたものをリストのリストのように使用することを検討してください。

+1

私はこのような要件もある意味で持っています。小さなJSONオブジェクト(チックデータ)のロードをプレーンテキストファイルに保存しています。これらのフィールドを特定の順序で並べ替えることで、JSONを解凍したり解読したりすることなく、データをソートすることができ、膨大な処理能力を節約し、エンコードされたデータに対して簡単な文字列比較を行うことができます。ほとんどの場合、私はあなたに同意しますが、それはおそらく軽く行われるべきではないと思います。 –

関連する問題