2016-07-22 12 views
0

こんにちは、私は本質的にjsonの中でysonのデータを使っています。 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ファイルを使用する必要はありません(私はそれを理解しています)。しかし、私の特定のケースでは、私はそれをしなければならないかもしれません。

編集:申し訳ありませんが、私はこのようになるはず所望の出力ファイル

を貼り付けdidntは:

{ 
    "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データをロードして書き込むことで、オブジェクト内のアイテムの順序が変更されることがあります(これは決して依存しないでください)。

関連する問題