2016-07-22 75 views
0

嗨我想實質上在json 中使用yaml數據,例如。如何將yaml鍵值鏈接到python中的json鍵值

JSON文件:

{ 
    "Name": "foo", 
    "Birthdate": "1/1/1991", 
    "Address": "FOO_ADDRESS", 
    "Note": "Please deliver package to foo at FOO_ADDRESS using COURIER service" 
} 

YAML文件:

 
--- 
FOO_ADDRESS: "foo lane, foo state" 
COURIER: "foodex" 

可能有人請指導我最有效的方式做到這一點?在這個特殊的例子中,我並不需要使用單獨的yaml文件(我明白這一點)。但在我的具體情況下,我可能必須這樣做。

編輯:對不起,我沒有粘貼所需的輸出文件

應該是這個樣子:

{ 
    "Name": "foo", 
    "Birthdate": "1/1/1991", 
    "Address": "foo lane, foo state", 
    "Note": "Please deliver package to foo at foo lane, foo state using foodex service" 
} 
+0

請更具體地說明你想做什麼。這是JSON文件您的輸入或所需的輸出?什麼時候應該更換變量?數據加載中?寫作?如果可能的話,清楚地顯示輸入和期望的輸出。 – flyx

+0

對不起,我錯過了。現在添加了所需的輸出。 – RedDevil

回答

0

爲了安全起見,先加載JSON,然後做在加載的字符串替換。如果您在JSON源代碼中進行替換,那麼最終可能會產生無效的JSON輸出(當替換字符串包含"或必須以JSON轉義的其他字符時)。

import yaml, json 

def doReplacements(jsonValue, replacements): 
    if isinstance(jsonValue, dict): 
    processed = {doReplacements(key, replacements): \ 
     doReplacements(value, replacements) for key, value in \ 
     jsonValue.iteritems()} 
    # Python 3: use jsonValue.items() instead 
    elif isinstance(jsonValue, list): 
    processed = [doReplacements(item, replacements) for item in jsonValue] 
    elif isinstance(jsonValue, basestring): 
    # Python 3: use isinstance(jsonValue, str) instead 
    processed = jsonValue 
    for key, value in replacements.iteritems(): 
     # Python 3: use replacements.items() instead 
     processed = processed.replace(key, value) 
    else: 
    # nothing to replace for Boolean, None or numbers 
    processed = jsonValue 
    return processed 

input = json.loads("""{ 
    "Name": "foo", 
    "Birthdate": "1/1/1991", 
    "Address": "FOO_ADDRESS", 
    "Note": "Please deliver package to foo at FOO_ADDRESS using COURIER service" 
} 
""") 

replacements = yaml.safe_load("""--- 
FOO_ADDRESS: "foo lane, foo state" 
COURIER: "foodex" 
""") 

print json.dumps(doReplacements(input, replacements), indent=2) 
# Python 3: `(...)` around print argument 

使用json.loadjson.dump讀/寫文件,而不是字符串。請注意,加載和寫入JSON數據可能會改變對象中項目的順序(您不應該依賴它)。