我试图使用.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)
我该如何解决这个问题?
答案 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"}'
这是最干净,最安全的方法。