带格式()keyerror的JSON字符串

时间:2017-05-02 14:46:27

标签: python json

我试图使用.format()来连接json字符串中的一些变量

<ListView SelectionMode="{x:Bind SelectionMode, Mode=OneWay}"/>

但是我得到了

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

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

我该如何解决这个问题?

2 个答案:

答案 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 :(得分:1)

您正在打破格式规则。通常,当您使用格式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"}'

这是最干净,最安全的方法。