Jawaban Mike Brennan dekat, tetapi tidak ada alasan untuk menelusuri ulang seluruh struktur. Jika Anda menggunakan object_hook_pairs
parameter (Python 2.7+):
object_pairs_hook
adalah fungsi opsional yang akan dipanggil dengan hasil objek apa pun yang diterjemahkan dengan daftar pasangan terurut. Nilai pengembalian object_pairs_hook
akan digunakan sebagai ganti dict
. Fitur ini dapat digunakan untuk mengimplementasikan decoder kustom yang bergantung pada urutan pasangan kunci dan nilai yang diterjemahkan (misalnya, collections.OrderedDict
akan mengingat urutan penyisipan). Jika object_hook
juga ditentukan, object_pairs_hook
prioritas akan diambil.
Dengan itu, Anda mendapatkan setiap objek JSON yang diserahkan kepada Anda, sehingga Anda dapat melakukan decoding tanpa perlu rekursi:
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'}}
Perhatikan bahwa saya tidak pernah harus memanggil kait secara berulang karena setiap objek akan diserahkan ke kait ketika Anda menggunakan object_pairs_hook
. Anda memang harus memperhatikan daftar, tetapi seperti yang Anda lihat, objek dalam daftar akan dikonversi dengan benar, dan Anda tidak perlu berulang untuk mewujudkannya.
EDIT: Seorang rekan kerja menunjukkan bahwa Python2.6 tidak punya object_hook_pairs
. Anda masih bisa menggunakan ini akan Python2.6 dengan membuat perubahan yang sangat kecil. Pada kait di atas, ubah:
for key, value in pairs:
untuk
for key, value in pairs.iteritems():
Kemudian gunakan object_hook
sebagai ganti 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'}}
Menggunakan object_pairs_hook
hasil dalam satu kamus kurang sedang dipakai untuk setiap objek di objek JSON, yang, jika Anda parsing dokumen besar, mungkin bernilai sementara.
str