このコードがKeyError
を与えるのはなぜですか?
output_format = """
{
"File": "{filename}",
"Success": {success},
"ErrorMessage": "{error_msg}",
"LogIdentifier": "{log_identifier}"
}
"""
print output_format.format(filename='My_file_name',
success=True,
error_msg='',
log_identifier='123')
エラーメッセージ:
KeyError: ' "File"'
外側の中括弧を2倍にする必要があります。それ以外の場合Pythonは{ "File"..
も参照であると見なします:
output_format = '{{ "File": "{filename}", "Success": {success}, "ErrorMessage": "{error_msg}", "LogIdentifier": "{log_identifier}" }}'
結果:
>>> print output_format.format(filename='My_file_name',
... success=True,
... error_msg='',
... log_identifier='123')
{ "File": "My_file_name", "Success": True, "ErrorMessage": "", "LogIdentifier": "123" }
兆候として、JSON出力を生成している場合は、 json
module :を使用したほうがよいでしょう。
>>> import json
>>> print json.dumps(dict(File='My_file_name',
... Success=True,
... ErrorMessage='',
... LogIdentifier='123'))
{"LogIdentifier": "123", "ErrorMessage": "", "Success": true, "File": "My_file_name"}
JSON標準で要求されているように、出力の小文字true
に注意してください。
Martijn Pieters に拡張して答えてコメントするには:
MArtijnのコメントによると、プレースホルダーではない{..}ペアをエスケープすることは、ネストされた辞書を使用する方法です。私はそれを成功させることができなかったので、以下の方法を提案します。
ネストされた辞書について、ネストされた辞書の{および}を2倍にしてみました。
a = '{{"names":{{"a": "{name}"}}}}'
a.format(name = 123)出力:
出力: '{"names":{"a": "123"}}'
ただし、これにより、formatを使用してjson文字列内の値を変更することになり、複雑すぎる方法になるため、formatコマンドにひねりを加えます。 json文字列の$ {param_name}を置き換えます。例えば:
事前定義されたJSONは次のようになります。
my_json_dict = {
'parameter': [
{
'name': 'product',
'value': '${product}'
},
{
'name': 'suites',
'value': '${suites}'
},
{
'name': 'markers',
'value': '${markers}'
}
]
}
パラメータの代わりに置き換える値としてこの辞書を提供します
parameters = {
'product': 'spam',
'suites': 'ham',
'markers': 'eggs'
}
そして、このコードを使用して交換を行います
json_str = json.dumps(my_json_dict)
for parameter_name, parameter_value in parameters.iteritems():
parameter_name = '${'+parameter_name+'}'
json_str = json_str.replace(parameter_name, parameter_value)
json_dict = json.loads(json_str)