使用字符串格式将参数传递给Python中的JSON查询



我希望使用.format((或其他方法,它将允许我在Python中向JSON查询传递参数。我在Python中使用了使用SQL的.format((,也用于将参数传递到网站链接等方面。理想情况下,我希望能够在开始时定义查询中的任何一个变量。如果有什么不同的话,我只是想了解为什么.format((在这里不起作用。

我已经搜索了很多,没有找到一个具体的例子来解决这个问题,所以如果这看起来很明显,我很抱歉。

这是尝试使用.format((时返回的错误:

Traceback (most recent call last):
File "rti3.py", line 25, in <module>
}""".format(adgroup)
KeyError: 'ntttt"category1"'

这是我的代码:

#!/usr/bin/python
import os.path
import requests
import sys
import json
campaignid = 0
data = """query={
"category1": "",
"kpi_or": false,
"campaign_id": {campaignid},
"pub_bid_rates":1000,
"creatives": [{"creative_type":"video", 
"banner_size":"320x250"}],
"geotargets": [{"type":6,"value":["us"]}],
"target_profiles": [],
"publishers": []
}""".format(campaignid)
def avails():
req = 'http://****.****.***.com:****/API'
resp = requests.post(req, data).json()
if 'adgroups' not in resp:
return 0
else:
return int(resp['adgroups'][0]['reach'])
def main(progname, argv):
print(avails())
if __name__ == '__main__':
try:
main(sys.argv[0], sys.argv[1:])
except Exception as err:
print('Caught exception:', err)
sys.exit(1)

.format()不工作,因为字符串中的所有{...}表达式都被解释为格式说明符。这可以通过加倍大括号并为除{campaignid}之外的所有内容编写{{...}}来解决,但在您的特定情况下,完全放弃使用.format()会更好。相反,只需将JSON编写为本地Python对象:

query_data = {
"category1": "",
"kpi_or": False,
"campaign_id": campaignid,
"pub_bid_rates":1000,
"creatives": [{"creative_type":"video", "banner_size":"320x250"}],
"geotargets": [{"type":6,"value":["us"]}],
"target_profiles": [],
"publishers": []
}

然后使用json.dumps将其转换为字符串:

data = 'query=' + json.dumps(query_data)
一种方法是加载json字符串并进行必要的更改。这一切都是关于格式化的东西。
import json
campaignid = 0
data = json.loads("""{"category1": "","kpi_or": false,"campaign_id": {},"pub_bid_rates":1000,"creatives": [{"creative_type":"video", "banner_size":"320x250"}],"geotargets": [{"type":6,"value":["us"]}],"target_profiles": [],"publishers": []}""")
data['campaign_id']=campaignid
json.dumps(data)

输出

'{"category1": "", "kpi_or": false, "publishers": [], "campaign_id": 0, "creatives": 
[{"banner_size": "320x250", "creative_type": "video"}], 
"target_profiles": [], "pub_bid_rates": 1000, "geotargets": [{"type": 6, "value": ["us"]}]}'

尝试将数据存储为字典,而不是格式字符串。

data = {"query": {"category1": "",
"kpi_or": False,
"campaing_id": campaignid,
"pub_bid_rates": 1000,
"creatives": [{"creative_type": "video",
"banner_size": "320x250"}],
"geotargets": [{"type": 6,
"value": ["us"]}],
"target_profiles": [],
"publishers": []}}
print(json.dumps(data))

输出:

{"query": {"category1": "", "kpi_or": false, "campaing_id": 0, "pub_bid_rates": 1000, "creatives": [{"creative_type": "video", "banner_size": "320x250"}], "geotargets": [{"type": 6, "value": ["us"]}], "target_profiles": [], "publishers": []}}

最新更新