2016-05-26 29 views
6

Per motivi di lettura, desidero avere un ordine di chiave specifico nel file json.Ordinamento di chiavi durante la codifica di una mappa in JSON con Poison

So che la chiave della mappa non ha alcun ordine e quindi non dovremmo fare affidamento su questo, ma poichè Poison non è in grado di codificare i proplists, non vedo come farlo.

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

Il risultato che vorrei è:

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

Quale struttura dovrei utilizzare al fine di raggiungere questo obiettivo con veleno?

risposta

1

Sei sicuro di voler fare questo? Probabilmente il modo meno peggio per farlo sarebbe definire una struttura per la tua mappa, e quindi implementare il protocollo di codifica Poison per quella struttura.

Potrebbe sembrare qualcosa di simile ...

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

poi da qualche parte nel progetto implementare il protocollo

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 

e poi

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

Detto questo, io 'davvero, davvero consiglio di non farlo. Le mappe ordinate sono sempre una pessima idea e portano ad un comportamento davvero fragile e confuso.

Considerare l'utilizzo di qualcosa che è effettivamente ordinato, come un elenco di liste

+1

Ho anche questo requisito in un certo senso. Stiamo memorizzando un sacco di piccoli oggetti JSON (dati tick) in file di testo. Ordinando i campi in un certo modo, i dati del tick possono essere ordinati senza la necessità di decomprimere/decodificare il JSON, il che consente di risparmiare una grande quantità di potenza di elaborazione e consente inoltre di utilizzare un semplice confronto tra stringhe sui dati codificati. Molto spesso, tuttavia, sono d'accordo con te sul fatto che probabilmente non dovrebbe essere fatto alla leggera. –