2016-05-26 6 views
6

Zum Lesen möchte ich eine bestimmte Tastenfolge in der JSON-Datei haben.Bestellschlüssel beim Kodieren einer Karte nach Json mit Poison

Ich weiß, dass der Schlüssel der Karte keine Reihenfolge hat, und dann sollten wir uns nicht darauf verlassen, aber da Poison keine Proplisten kodieren kann, sehe ich nicht, wie das geht.

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

Das Ergebnis Ich mag würde, ist:

"{\"from\":\"EUR\", \"to\":\"USD\", \"rate\":0.845}" 

Welche Struktur soll ich verwenden, um diese mit Gift zu erreichen?

Antwort

1

Sind Sie sicher, dass Sie dies tun möchten? Der wahrscheinlich schlechteste Weg wäre, eine Struktur für Ihre Map zu definieren und dann das Poison-Encoding-Protokoll für diese Struktur zu implementieren.

es so etwas wie dies aussehen könnte ...

defmodule Currency do 
    defstruct from: "", to: "", rate: 0 
end 

dann irgendwo in Ihrem Projekt umzusetzen, das Protokoll

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 

und dann

Poison.encode!(%Currency{from: "USD", to: "EUR", rate: .845}) 

dass das All ist, ich Ich würde wirklich, wirklich empfehlen, dies nicht zu tun. Geordnete Karten sind immer eine schreckliche Idee und führen zu einem wirklich spröden und verwirrenden Verhalten.

Verwenden Sie etwas, das tatsächlich bestellt wird, wie eine Liste von Listen

+1

Ich habe auch diese Anforderung in gewissem Sinne. Wir speichern viele kleine JSON-Objekte (Tick-Daten) in einfachen Textdateien. Indem die Felder auf eine bestimmte Weise geordnet werden, können die Tick-Daten sortierbar gemacht werden, ohne das JSON entpacken/dekodieren zu müssen, was eine enorme Rechenleistung einspart und außerdem einen einfachen String-Vergleich der codierten Daten ermöglicht. Meistens stimme ich Ihnen jedoch zu, dass dies wahrscheinlich nicht leichtfertig geschehen sollte. –

Verwandte Themen