คำตอบของ Mike Brennanนั้นใกล้เคียงกัน แต่ไม่มีเหตุผลใดที่จะสำรวจโครงสร้างทั้งหมดอีกครั้ง หากคุณใช้object_hook_pairs
พารามิเตอร์ (Python 2.7+):
object_pairs_hook
เป็นฟังก์ชั่นเสริมที่จะถูกเรียกพร้อมกับผลลัพธ์ของวัตถุใด ๆ ที่ถอดรหัสด้วยรายการคู่ที่สั่ง ค่าตอบแทนของจะถูกนำมาใช้แทนobject_pairs_hook
dict
คุณลักษณะนี้สามารถใช้ในการใช้ตัวถอดรหัสที่กำหนดเองซึ่งขึ้นอยู่กับลำดับที่คู่คีย์และค่าถูกถอดรหัส (ตัวอย่างเช่นcollections.OrderedDict
จะจดจำลำดับของการแทรก) หากobject_hook
มีการกำหนดเช่นobject_pairs_hook
กัน
ด้วยสิ่งนี้คุณจะได้รับวัตถุ JSON แต่ละตัวเพื่อให้คุณสามารถถอดรหัสได้โดยไม่จำเป็นต้องเรียกซ้ำ
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'}}
object_pairs_hook
ขอให้สังเกตว่าฉันไม่เคยมีการโทรเบ็ดซ้ำตั้งแต่วัตถุทุกคนจะได้รับการส่งให้เบ็ดเมื่อคุณใช้ คุณต้องใส่ใจกับรายการต่างๆ แต่อย่างที่คุณเห็นวัตถุในรายการจะถูกแปลงอย่างเหมาะสมและคุณไม่จำเป็นต้องรับเงินคืนเพื่อให้เกิดขึ้น
แก้ไข: ผู้ร่วมงานชี้ให้เห็นว่า Python2.6 object_hook_pairs
ไม่ได้ คุณยังสามารถใช้ Python2.6 นี้ได้โดยทำการเปลี่ยนแปลงเล็กน้อย ในตะขอด้านบนเปลี่ยน:
for key, value in pairs:
ถึง
for key, value in pairs.iteritems():
จากนั้นใช้object_hook
แทน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 ซึ่งหากคุณแยกวิเคราะห์เอกสารขนาดใหญ่อาจคุ้มค่าในขณะที่
str