2012-04-18 26 views
8

Tôi gặp sự cố khi tôi muốn chuyển đổi chuỗi json thành từ điển Python. Tôi có chuỗi nhưLàm thế nào để chuyển đổi chuỗi json thành từ điển và lưu thứ tự trong các phím?

s={"name":{"Saban:Saulic"},"price":{"koncert:1000"} ....} 

khi tôi viết một cái gì đó giống như

tags=json.loads(s) 

tôi gtet điển nhưng thứ tự của các phím không giống như trong chuỗi (nó không được đặt tên, giá ...). Làm thế nào để chuyển đổi chuỗi json để từ điển và lưu thứ tự trong các phím?

+2

điển Python là không có thứ tự, mà là tốt vì thông thường bạn truy cập vào các mục * bằng phím * và nếu bạn có để lặp qua các yếu tố, các trật tự thường không quan trọng. Btw, 's' không phải là một chuỗi hay một từ điển không phải là JSON hợp lệ nếu nó là một chuỗi. Có vẻ như bạn đang theo một cấu trúc khác, chẳng hạn như một mảng các đối tượng: '[{" name ":" ... "," price ":" ... "}, ...]'. Nếu bạn cung cấp một số giải thích cho * lý do tại sao * bạn cần các phím theo thứ tự và cung cấp một ví dụ chính xác, sau đó chúng tôi có thể giúp bạn tốt hơn. –

+0

Không thực sự là một thứ như "thứ tự các khóa" trong một 'dict'. Bạn có thể lặp lại chúng từng cái một, nhưng không có quyền kiểm soát thứ tự bạn nhận được chúng. –

+3

Tôi nghĩ [this previous] (http: // stackoverflow.com/questions/6921699/can-i-get-json-to-tải-vào-một-lệnh-lệnh-in-python) câu hỏi ở đây trên Stackoverflow cung cấp một câu trả lời. – Alvin

Trả lời

21

Kể từ Python 2.7 bạn có OrderedDict mô-đun từ collections

Đây là loại từ điển giữ gìn trật tự chèn của các yếu tố.

Từ tài liệu Python:

json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

Deserialize fp (một .read() - hỗ trợ đối tượng tập tin giống như có chứa một tài liệu JSON) cho một đối tượng Python.

Nếu nội dung của fp được mã hóa với mã hóa ASCII khác hơn UTF-8 (ví dụ: latin-1), thì tên mã hóa thích hợp phải là được chỉ định. Các mã hóa không dựa trên ASCII (như UCS-2) không được cho phép và phải được gói bằng codecs.getreader (mã hóa) (fp) hoặc chỉ đơn giản là giải mã thành đối tượng unicode và được chuyển tới tải().

object_hook là một chức năng tùy chọn sẽ được gọi với kết quả của bất kỳ đối tượng nào được giải mã bằng chữ (một mệnh đề). Giá trị trả lại của object_hook sẽ được sử dụng thay cho dict. Có thể sử dụng tính năng này để triển khai bộ giải mã tùy chỉnh (ví dụ: gợi ý lớp JSON-RPC).

object_pairs_hook là một chức năng tùy chọn sẽ được gọi với kết quả của bất kỳ đối tượng được giải mã bằng chữ nào với một danh sách thứ tự các cặp. Giá trị trả về của object_pairs_hook sẽ được sử dụng thay cho số dict. Có thể sử dụng tính năng này để triển khai bộ giải mã tùy chỉnh dựa trên theo thứ tự mà các cặp khóa và giá trị được giải mã (ví dụ: bộ sưu tập.OrderedDict() sẽ nhớ thứ tự chèn). Nếu object_hook cũng được xác định, object_pairs_hook được ưu tiên.

Tôi nghĩ rằng bạn có thể sử dụng object_pairs_hook tham số với collections.OrderedDict()

tags=json.loads(s, object_pairs_hook=collections.OrderedDict) 
Các vấn đề liên quan