2016-05-26 9 views
6

Do celów odczytu chciałbym mieć konkretną kolejność klawiszy w pliku json.Zamawianie kluczy podczas kodowania mapy do json za pomocą Poison

Wiem, że klucz mapy nie ma żadnego porządku, a następnie nie powinniśmy polegać na tym, ale ponieważ Trucizna nie jest w stanie kodować listy propozycji, nie wiem, jak to zrobić.

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

Wynik Chciałbym to:

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

Która struktura należy użyć w tym celu z trucizną?

Odpowiedz

1

Czy na pewno chcesz to zrobić? Prawdopodobnie najmniejszym złym sposobem byłoby zdefiniowanie struktury dla twojej mapy, a następnie zaimplementowanie protokołu kodowania Trucizny dla tej struktury.

Może to wyglądać mniej więcej tak ...

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

następnie gdzieś w projekcie wdrożenia protokołu

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 

a następnie

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

Wszystko, co powiedziałem, Naprawdę, naprawdę polecam, aby tego nie robić. Uporządkowane mapy są zawsze strasznym pomysłem i prowadzą do naprawdę kruchych i mylących zachowań.

Rozważ skorzystanie z czegoś, co jest faktycznie zamawiane, tak jak lista list.

+1

Też mam ten wymóg w pewnym sensie. Przechowujemy mnóstwo małych obiektów JSON (dane tick) w plikach tekstowych. Dzięki uporządkowaniu pól w określony sposób dane sortowania można sortować bez potrzeby rozpakowywania/dekodowania JSON, co oszczędza ogromną moc obliczeniową, a także umożliwia stosowanie prostego porównywania ciągów na zakodowanych danych. Najczęściej jednak zgadzam się z tobą, że prawdopodobnie nie należy tego robić lekko. –

Powiązane problemy