Mike Brennan'ın yanıtı yakın, ancak tüm yapıyı yeniden dolaşmak için bir neden yok. Eğer kullanırsanız object_hook_pairs
(Python 2.7+) parametresini:
object_pairs_hook
, sıralı bir çift listesi ile kodu çözülen herhangi bir nesnenin sonucuyla çağrılacak isteğe bağlı bir işlevdir. Dönüş değeri. object_pairs_hook
Yerine kullanılacaktır dict
. Bu özellik, anahtar ve değer çiftlerinin kodunun çözülme sırasına dayanan özel kod çözücüleri uygulamak için kullanılabilir (örneğin, collections.OrderedDict
ekleme sırasını hatırlar). Eğer object_hook
ayrıca tanımlanır, object_pairs_hook
öncelik kazanır.
Bununla birlikte, her JSON nesnesini size teslim edersiniz, böylece kod çözmeyi özyineleme gerektirmeden yapabilirsiniz:
def deunicodify_hook(pairs):
new_pairs = []
for key, value in pairs:
if isinstance(value, unicode):
value = value.encode('utf-8')
if isinstance(key, unicode):
key = key.encode('utf-8')
new_pairs.append((key, value))
return dict(new_pairs)
In [52]: open('test.json').read()
Out[52]: '{"1": "hello", "abc": [1, 2, 3], "def": {"hi": "mom"}, "boo": [1, "hi", "moo", {"5": "some"}]}'
In [53]: json.load(open('test.json'))
Out[53]:
{u'1': u'hello',
u'abc': [1, 2, 3],
u'boo': [1, u'hi', u'moo', {u'5': u'some'}],
u'def': {u'hi': u'mom'}}
In [54]: json.load(open('test.json'), object_pairs_hook=deunicodify_hook)
Out[54]:
{'1': 'hello',
'abc': [1, 2, 3],
'boo': [1, 'hi', 'moo', {'5': 'some'}],
'def': {'hi': 'mom'}}
Kancayı yinelemeli olarak çağırmam gerektiğine dikkat edin, çünkü her nesne kullandığınızda kancaya teslim edilecektir object_pairs_hook
. Listeleri önemsemeniz gerekir, ancak gördüğünüz gibi, bir listedeki bir nesne düzgün bir şekilde dönüştürülür ve bunun gerçekleşmesi için tekrarlaması gerekmez.
EDIT: Bir iş arkadaşı Python2.6 sahip olmadığına dikkat çekti object_hook_pairs
. Yine de çok küçük bir değişiklik yaparak Python2.6'yı kullanabilirsiniz. Yukarıdaki kancada değiştirin:
for key, value in pairs:
için
for key, value in pairs.iteritems():
Sonra kullanmak object_hook
yerine object_pairs_hook
:
In [66]: json.load(open('test.json'), object_hook=deunicodify_hook)
Out[66]:
{'1': 'hello',
'abc': [1, 2, 3],
'boo': [1, 'hi', 'moo', {'5': 'some'}],
'def': {'hi': 'mom'}}
object_pairs_hook
JSON nesnesindeki her nesne için somutlaştırılmakta olan daha az bir sözlükte sonuçları kullanmak , eğer büyük bir belgeyi ayrıştırıyorsanız, buna değer olabilir.
str