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"'
哪有我解决这个问题?
答
翻倍外花括号以避免解释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"}'
它是最干净和最安全的方法。
你是如何连接的? –