0

here에 설명 된 방법을 사용하면 순서를 유지하기 위해 중첩 된 JSON 파일을로드 할 때 OrderedDictobject_pairs_hook으로 전달합니다.JSON을로드 할 때 순서를 유지하고 모든 키를 유지 관리 하시겠습니까?

주문이 보존되며, 이는 의 경우 대부분의 JSON 개체에 적합합니다.

"In Content" : { "Sulvo" : "abc.com_336x280_he-inlinecontentmobile", "Sulvo" : "abc.com_336x280_he-inlinecontentmobile_level2", "Sulvo" : "abc.com_336x280_he-inlinecontentmobile_level3", "Adsense" : "" },

가공 할 때, 이들과 동일한 키들 중 하나만이 유지 얻는다 : 그러나 모양 (중첩 최하위 레벨에서) JSON 부분이있다

OrderedDict([(u'Sulvo', u'homeepiphany.com_336x280_he-inlinecontentmobile_level3'), (u'Adsense', u'')])),

defaultdict과 동일한 키 이름의 여러 항목을 가진 사전을 가질 수 있다는 것을 알고 있습니다. 다음은 그래도 작동하지 않으며, 우리가 열쇠를 얻을 수 있지만, 순서를 잃게 추정는 않았다조차, 그래서 우리는 오프 더 좋은 없을 것 :

j = json.load(open('he.json'), object_pairs_hook=defaultdict)

은 질서를 유지하는 것이 가능 은 모든 키를 한 번에 보존합니까?

파이썬 2.7.12

답변

1

당신이 docs for json.load 보면, 그들은 object_pairs_hook 매개 변수가 무엇 개요 :

object_pairs_hook 디코딩 문자 개체의 결과로 호출되는 선택적 기능입니다 쌍의 정렬 된 목록이 있습니다. object_pairs_hook의 반환 값은 dict 대신 사용됩니다.

당신이해야 할 일은 (key, value) 쌍의 목록이 주어진 개체를 구성하는 함수를 작성하는 것입니다.

한 가지 방법은 아무것도하지 않고 단지 사전 구성없이 직선을 통해 항목 목록을 통과하는 것입니다 : 다음

def handle_mapping(items): 
    return items 

를, 당신의 JSON은과 같이 구문 분석됩니다 :

[(u'In Content', 
    [(u'Sulvo', u'abc.com_336x280_he-inlinecontentmobile'), 
    (u'Sulvo', u'abc.com_336x280_he-inlinecontentmobile_level2'), 
    (u'Sulvo', u'abc.com_336x280_he-inlinecontentmobile_level3'), 
    (u'Adsense', u'')])] 

당신이 할 경우 중복 키 값을 목록에 병합하려면 OrderedDict :

def handle_mapping(items): 
    d = OrderedDict() 
    duplicate_keys = set() 

    for key, value in items: 
     # So [('k', 'v')] becomes {'k': 'v'} 
     if key not in d: 
      d[key] = value 
     else: 
      # So [('k', 'v1'), ('k', 'v2')] becomes {'k': ['v1', 'v2']} 
      if key not in duplicate_keys: 
       duplicate_keys.add(key) 
       d[key] = [d[key]] 

      d[key].append(value) 

    return d 

그러면 객체는 다음과 같이 구문 분석됩니다.

OrderedDict([(u'In Content', 
       OrderedDict([(u'Sulvo', 
          [u'abc.com_336x280_he-inlinecontentmobile', 
          u'abc.com_336x280_he-inlinecontentmobile_level2', 
          u'abc.com_336x280_he-inlinecontentmobile_level3']), 
          (u'Adsense', u'')]))]) 
+0

그 대답은 하나의 지옥입니다. 'handle_mapping()'제안까지 왔습니다. json 파일을'json.load()'로 전달하는 것, 즉'object_pairs_hook'을 지정하지 않는 것 또한 놀라운 결과였습니다. 더미 함수를 전달하면 결과가 보존되는 반면 아이템은 잃어 버렸습니다. 내일 당신의 완전한 해결책을 시도 할 것입니다. 감사. – Pyderman

+0

@Pyderman : 파이썬에서'dict ([('a', 1), ('a', 1)]) == { 'a': 1} == { 'a': 1, 'a' 1}', 왜냐하면 사전에 중복 된 키를 갖는 것이 의미가 없기 때문입니다 ('d [ 'a']')?). 자바 스크립트 (** J ** SON의 J)도 똑같습니다. JSON이 너처럼 이상한 경우 Python이 사전이 아닌 다른 것을 사용하여 요소를 보유하도록 지시해야한다. – Blender