JSON字符串格式()KeyError异常

问题描述:

我试图使用.format()来连接在一个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) 

一些变数,但是我越来越

KeyError: '"message"' 

哪有我解决这个问题?

+0

你是如何连接的? –

翻倍外花括号以避免解释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标识符。

您正在破坏格式规则。通常,当您使用格式Python looks for the following

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

所以你的情况"message"成为FIELD_NAME,因为{是之前和之后:。这显然不起作用。 .format()方法不适用于复杂的嵌套文本结构。

一种方法是使用string.Template together with .substitute代替:

>>> 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"}}} }' 

但是这也并不意味着与嵌套的文本结构中使用。

由于您使用的是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"}' 

它是最干净和最安全的方法。