2016-05-26 15 views
6

Để đọc mục đích, tôi muốn có một thứ tự khóa cụ thể vào tệp json.Phím đặt hàng khi mã hóa bản đồ thành json với Poison

Tôi biết rằng khóa của bản đồ không có bất kỳ thứ tự nào và sau đó chúng ta không nên dựa vào đó, nhưng vì Poison không thể mã hóa các nhà cung cấp dịch vụ nên tôi không thấy cách thực hiện điều này.

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

Kết quả tôi muốn là:

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

Những cấu trúc tôi nên sử dụng để đạt được điều này với Poison?

Trả lời

1

Bạn có chắc chắn muốn thực hiện việc này không? Có lẽ cách kém nhất để làm điều đó là xác định cấu trúc cho bản đồ của bạn, và sau đó thực hiện giao thức mã hóa Poison cho cấu trúc đó.

Nó có thể giống như thế này ...

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

sau đó ở đâu đó trong dự án của bạn thực hiện các giao thức

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 

và sau đó

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

Tất cả những gì đang được nói, tôi thực sự, thực sự khuyên bạn không nên làm điều này. Bản đồ đặt hàng luôn là một ý tưởng tồi tệ và dẫn đến một số hành vi thực sự giòn và khó hiểu.

Cân nhắc sử dụng thứ gì đó thực sự được đặt hàng, như danh sách các danh sách

+1

Tôi cũng có yêu cầu này theo nghĩa nào đó. Chúng tôi đang lưu trữ vô số các đối tượng JSON nhỏ (dữ liệu đánh dấu) trong các tệp văn bản thuần túy. Bằng cách sắp xếp các trường theo một cách nhất định, dữ liệu đánh dấu có thể sắp xếp mà không cần giải nén/giải mã JSON để tiết kiệm một lượng lớn sức mạnh xử lý và cũng có thể sử dụng so sánh chuỗi đơn giản trên dữ liệu được mã hóa. Tuy nhiên, tôi thường đồng ý với bạn rằng nó có lẽ không nên được thực hiện một cách nhẹ nhàng. –

Các vấn đề liên quan