2017-05-02 13 views
0

私はJSON文字列形式のJSON文字列()KeyError例外

subscription_info = '{"endpoint":"xxx","keys":{"p256dh":"xxx","auth":"xxx"}}' 

send_data = '{"message":"message_test", "subscription_info": {$subscription_info} }'.format(subscription_info=subscription_info) 

にいくつかの変数を連結する)(.formatを使用しようとしている。しかしどのようにすることができ、私は

KeyError: '"message"' 

を取得していますこれを修正しますか?

+0

どのように連結していますか? –

答えて

1

ダブルアップ形式のフィールドとしてmessageを解釈回避するために、外側中括弧:

send_data = '{{"message":"message_test", "subscription_info": {subscription_info} }}'.format(subscription_info=subscription_info) 
print(send_data) 
# {"message":"message_test", "subscription_info": {"endpoint":"xxx","keys":{"p256dh":"xxx","auth":"xxx"}} } 

を、あなたのフォーマット文字列で$は必要ありません。名前付きフィールドを使用する必要がある場合は、有効なPython識別子が必要です。

1

フォーマットルールが破られています。あなたはフォーマットPython looks for the following

"{" [field_name] ["!" conversion] [":" format_spec] "}" 

を使用する場合{が、その前にあり、それの後:ので、通常だからあなたの場合には"message"は、FIELD_NAMEになります。これは明らかに機能しません。 .format()メソッドは、複雑なネストされたテキスト構造では使用されません。

>>> tmpl = string.Template('{"message":"message_test", "subscription_info": {$subscription_info} }') 
>>> tmpl.substitute(subscription_info=subscription_info) 
'{"message":"message_test", "subscription_info": {{"endpoint":"xxx","keys":{"p256dh":"xxx","auth":"xxx"}}} }' 

を、また、ネストされたテキストの構造に使用されるものではないが:

一つの方法は、代わりにstring.Template together with .substituteを使用することです。

あなたはJSONを使用しているので、代わりにparse and serialize the JSONを入力する必要があります。

>>> import json 
>>> subscription_info = {"endpoint":"xxx","keys":{"p256dh":"xxx","auth":"xxx"}} 
>>> send_data = {"message":"message_test", "subscription_info": subscription_info } 
>>> json.dumps(send_data) 
'{"subscription_info": {"endpoint": "xxx", "keys": {"auth": "xxx", "p256dh": "xxx"}}, "message": "message_test"}' 

それはクリーンで安全な方法である:これは、問題を処理するための適切な方法です。