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
. 파이썬 2.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