2017-11-24 5 views
-1

내가 목록을 포함하는이 JSON 파일이 좋아하는 오브젝트 : 나는 locales 광고 반복 (로케일에 드, FR, NL 등을 따라 vegetables를 조작하고 싶은 으로 반복은

"locales": { 
    "de": { 
     "default": { 
      "vegetables": [ 
       "apple", 
       "melon", 
       "grape", 
       "pear" 
      ] 
     } 
    }, 
    "fr": { 
     "default": { 
      "vegetables": [ 
       "apple", 
       "melon", 
       "grape", 
       "pear" 
      ] 
     } 
    }, 
    "nl": { 
     "default": { 
      "vegetables": [ 
       "apple", 
       "melon", 
       "grape", 
       "pear" 
      ] 
     } 
    }, 
(...) 
} 

). 파이썬으로 어떻게하면 될까요?

나는 불행하게도이 작동하지 않습니다

import json 

_MY_CUSTOM_ORDER_DE = [ 
    "pear", 
    "grape", 
    "apple", 
    "melon"] 

_MY_CUSTOM_ORDER_NL = [ 
    "melon", 
    "pear", 
    "apple", 
    "grape"] 

def updateJsonFile(): 
    jsonFile = open('vegetables.json', 'r') 
    data = json.load(jsonFile) 
    jsonFile.close() 

    for item in data["locales"]: 
     if item == "de": 
      item["default"]["vegetables"] = _MY_CUSTOM_ORDER_DE 
     elif item == "nl": 
      item["default"]["vegetables"] = _MY_CUSTOM_ORDER_NL 
     else: 
      ## do nothing ## 

     with open('sortedvegetables.json', 'w') as outfile: 
     json.dump(data, outfile, indent=4, sort_keys=True) 

def main(): 
    updateJsonFile() 

if __name__ == '__main__': 
    main() 

같은 시도하지만 스크립트를 실행 한 후 터미널에 오류가 지금있다. sortedvegetables.json 정확히 같은 다음과 같은 vegetables.json

+0

더 명확하게 표시 할 수 있습니까? 당신이 정말로보고있는 것을 이해할 수 없습니까? 몇 가지 명확한 예를 들어주세요! – iamnewuser

+0

_MY_CUSTOM_ORDER_DE 및 _MY_CUSTOM_ORDER_NL도 표시합니다. – iamnewuser

+3

어디에서 updateJsonFile을 호출합니까? –

답변

1

답을 찾습니다

당신은 당신의 코드에서 몇 가지 논리적 인 결함을했다.

1) 목록으로 비교하려고했습니다.

if item == ["de"]: 

그것은해야한다 : 당신은 item["default"]["vegetables"]으로 업데이트하려고했다 if item == "de":

2), 그것은 올바른 방법으로하지 않습니다, 적절 data["locales"]["de"]["default"]["vegetables"] 또는 data["locales"]["nl"]["default"]["vegetables"]로 작성해야한다.

import json 

_MY_CUSTOM_ORDER_DE = [ 
    "pear", 
    "grape", 
    "apple", 
    "melon"] 

_MY_CUSTOM_ORDER_NL = [ 
    "melon", 
    "pear", 
    "apple", 
    "grape"] 

def updateJsonFile(): 
    jsonFile = open('vegetables.json', 'r') 
    data = json.load(jsonFile) 
    jsonFile.close() 

    for item in data["locales"]: 
     print(item) 
     if item == "de": 
      print(item) 
      data["locales"]["de"]["default"]["vegetables"] = _MY_CUSTOM_ORDER_DE 
     elif item == "nl": 
      print(item) 
      data["locales"]["nl"]["default"]["vegetables"] = _MY_CUSTOM_ORDER_NL 
     else: 
      print("test") 
      pass 

     with open('sortedvegetables.json', 'w') as outfile: 
      json.dump(data, outfile, indent=4, sort_keys=True) 

def main(): 
    updateJsonFile() 

if __name__ == '__main__': 
    main() 
0

JSON의 근본적인 오해가 있습니다. 사전에는 고유 한 순서가 없습니다. 항목을 정렬하려고 시도하는 것은 의미가 없습니다.

이전 버전의 Python은 얼마나 많은 양의 인터프리터를 내부적으로 저장했는지에 상관없이 내부 dict을 덤프했습니다. 최신 Python 버전을 사용하면 dict이 사용자가 만든 순서대로 돌아올 것으로 예상 할 수 있지만 JSON 의미는 여전히 결국 사전에 대한 순서가없는 표현입니다.