2013-06-14 9 views
24

this conversion table'a göre, Python inters, JSON modülü kullanılarak serileştirildiğinde, beklediğim ve arzu ettiğim gibi JSON numaraları olarak yazılır.Neden bir python dict ın int tuşları json.dumps kullanırken dizeye dönüşür?

Ben bir tamsayı anahtar ve tamsayı değeri olan bir sözlük var: Ben bir JSON dizeye bu seri hale getirmek için json modülünü kullandığınızda

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

, Değer bir sayı olarak yazılır, ancak anahtar yazılır bir dize olarak:

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

istediğim davranış değildir ve yuvarlak açma json.dumps/json.loads kırar beri özellikle kırık görünüyor:

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

Bu neden oluyor ve anahtarın bir sayı olarak yazılmasını zorlaştırmanın bir yolu var mı? İlk alıcı uygulaması teknik olarak-geçersiz JSON işleyebilir sağlamak gerekir -

+4

JSON anahtarları * her zaman * dizgidir. – duffymo

+2

... ve JSON dizeleri kullanır, çünkü bayt sırası bağımsızdır. – martineau

+3

JSON * kesinlikle * gerekli değilse, yerine YAML için PyYAML kullanarak gidebilir: 'd = {1: 2, 3: 4}; ithalat yaml; yaml.safe_load (yaml.safe_dump (d)) == d ', True değerini döndürür. Genelde YAML'nin 'inline' stili daha esnek bir jsona benziyor (tuşlar sayı olabilir, dizgiler genellikle alıntılanmak zorunda değil). Burada 'safe_load' kullanıyorum çünkü normal 'yaml.load', doğru şekilde sabitlenmesi zor olan özelliklere (sınıfların oluşturulması, vb.) Sahip; 'safe_load | dump' destekli giriş/çıkış setini ilkel türlere (bool, int, float, string, liste, set, dict) sınırlar ve böylece keyfi girişlerde kullanmak güvenlidir. – kampu

cevap

31

basit bir nedeni JSON does not allow integer keys. Bu kısıtlamaya etrafında nasıl gelince

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

olmasıdır. Ardından tüm teklif işaretlerini değiştirebilir veya özel bir seri hale getirici kullanabilirsiniz.

+1

Ve düz javascript aksine. tüm anahtarlar alıntılanmalıdır. –

İlgili konular