2013-06-14 51 views
24

Theo this conversion table, ints Python được viết dưới dạng số JSON khi được tuần tự hóa bằng mô-đun JSON - như tôi mong đợi và mong muốn.Tại sao các phím int của một dict python biến thành chuỗi khi sử dụng json.dumps?

Tôi có một cuốn từ điển với một phím số nguyên và số nguyên giá trị:

>>> d = {1:2} 
>>> type(d.items()[0][0]) 
<type 'int'> 
>>> type(d.items()[0][1]) 
<type 'int'> 

Khi tôi sử dụng các mô-đun json để serialize này thành một chuỗi JSON, giá trị được viết như một số, nhưng quan trọng là viết như là một chuỗi:

>>> json.dumps(d) 
'{"1": 2}' 

Đây không phải là hành vi của tôi muốn, và có vẻ như đặc biệt bị phá vỡ kể từ khi nó phá vỡ json.dumps/json.loads tròn vấp ngã:

>>> d == json.loads(json.dumps(d)) 
False 

Tại sao điều này xảy ra và có cách nào tôi có thể buộc khóa được viết dưới dạng số không?

+4

Khóa JSON là * luôn * chuỗi. – duffymo

+2

... và JSON sử dụng chuỗi vì chúng độc lập theo thứ tự byte. – martineau

+3

Nếu JSON không * đúng * yêu cầu, bạn có thể dùng YAML bằng PyYAML thay vì: 'd = {1: 2, 3: 4}; nhập yaml; yaml.safe_load (yaml.safe_dump (d)) == d' trả về True. Nói chung phong cách 'nội tuyến' của YAML trông giống như json linh hoạt hơn (các khóa có thể là số, các chuỗi thường không phải được trích dẫn). Tôi sử dụng 'safe_load' ở đây vì bình thường' yaml.load' có các tính năng (xây dựng các lớp, v.v) mà khó bảo mật một cách chính xác; 'safe_load | dump' hạn chế tập hợp các đầu vào/đầu ra được hỗ trợ thành các kiểu nguyên thủy (bool, int, float, string, list, set, dict) và do đó an toàn để sử dụng trên các đầu vào tùy ý. – kampu

Trả lời

31

Lý do đơn giản là JSON does not allow integer keys.

object 
    {} 
    { members } 
members 
    pair 
    pair , members 
pair 
    string : value # Keys *must* be strings. 

Như thế nào để khắc phục hạn chế này - lần đầu tiên bạn sẽ cần phải đảm bảo rằng việc thực hiện tiếp nhận có thể xử lý về mặt kỹ thuật JSON-không hợp lệ. Sau đó, bạn có thể thay thế tất cả các dấu trích dẫn hoặc sử dụng một serializer tùy chỉnh.

+1

Và không giống như javascript thuần túy. tất cả các phím nên được trích dẫn. –

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