使用在POST请求后返回嵌套JSON数据集的API。它期望有效负载为:
payload = '{"metrics":[ {"name":"Jobs.2019"}, {"name", "Jobs.2018"], "constraints": ["dimensionName": "Area", "map": {"Adams, OH":["39001"],"Allen, OH":["39003"]} }, {"dimensionName": "Industry", "map": {"Crop Production":["111000"]} } ] }'其中,{"Adams,OH":" 391001 "}将标签放在FIPS码391001上以供查找。问题是俄亥俄州有88个县,美国每个州都有更多的县。
我想我可以把这些县作为counties.json
{
"Adams, OH":[
"39001"
],
"Allen, OH":[
"39003"
]
}并在我的脚本中设置变量
with open('data.json', 'r') as json_file:
counties = json.load(json_file)然后调用我的请求
metrics = '[{"name": "Jobs.2019" }, {"name": "Jobs.2018"}, {"name": "Jobs.2017"}, {"name": "Jobs.2016"}, {"name": "Jobs.2015"}, {"name": "Jobs.2020"}, {"name": "Estab.2019" }, {"name": "Estab.2018"}, {"name": "Estab.2017"}, {"name": "Estab.2016"}, {"name": "Estab.2015"}, {"name": "Estab.2014"}, {"name": "EPW.2019"}, {"name": "EPW.2018"}, {"name": "EPW.2017"}, {"name": "EPW.2016"}, {"name": "EPW.2015"}, {"name": "EPW.2014"}]'
payload = f'{{"metrics": {metrics}, "constraints": [{{"dimensionName": "Area", "map": {counties} }}, {{"dimensionName": "Industry", "map": {{"Crop Production":["111000"]}} ]}}'
result = requests.request("POST", url, headers=headers, data=payload)但是,这将返回一个错误请求的<400>,我的有效负载如下所示:
{"metrics": [{"name": "Jobs.2019" }, {"name": "Jobs.2018"}, {"name": "Jobs.2017"}, {"name": "Jobs.2016"}, {"name": "Jobs.2015"}, {"name": "Jobs.2020"}, {"name": "Estab.2019" }, {"name": "Estab.2018"}, {"name": "Estab.2017"}, {"name": "Estab.2016"}, {"name": "Estab.2015"}, {"name": "Estab.2014"}, {"name": "EPW.2019"}, {"name": "EPW.2018"}, {"name": "EPW.2017"}, {"name": "EPW.2016"}, {"name": "EPW.2015"}, {"name": "EPW.2014"}], "constraints": [{"dimensionName": "Area", "map": {'Adams, OH': ['39001'], 'Allen, OH': ['39003']} }, {"dimensionName": "Industry", "map": {"Crop Production":["111000"]} ]}但是,当我调用它时:
metrics = '[{"name": "Jobs.2019" }, {"name": "Jobs.2018"}, {"name": "Jobs.2017"}, {"name": "Jobs.2016"}, {"name": "Jobs.2015"}, {"name": "Jobs.2020"}, {"name": "Estab.2019" }, {"name": "Estab.2018"}, {"name": "Estab.2017"}, {"name": "Estab.2016"}, {"name": "Estab.2015"}, {"name": "Estab.2014"}, {"name": "EPW.2019"}, {"name": "EPW.2018"}, {"name": "EPW.2017"}, {"name": "EPW.2016"}, {"name": "EPW.2015"}, {"name": "EPW.2014"}]'
payload = '{"metrics":' + metrics + ',"constraints": [{"dimensionName": "Area", "map": {"Adams, OH":["39001"],"Allen, OH":["39003"]} }, {"dimensionName": "Industry", "map": {"Crop Production":["111000"]} } ] }'
result = requests.request("POST", url, headers=headers, data=payload)我收到一个负载如下的<200>:
{"metrics":[{"name": "Jobs.2019" }, {"name": "Jobs.2018"}, {"name": "Jobs.2017"}, {"name": "Jobs.2016"}, {"name": "Jobs.2015"}, {"name": "Jobs.2020"}, {"name": "Estab.2019" }, {"name": "Estab.2018"}, {"name": "Estab.2017"}, {"name": "Estab.2016"}, {"name": "Estab.2015"}, {"name": "Estab.2014"}, {"name": "EPW.2019"}, {"name": "EPW.2018"}, {"name": "EPW.2017"}, {"name": "EPW.2016"}, {"name": "EPW.2015"}, {"name": "EPW.2014"}],"constraints": [{"dimensionName": "Area", "map": {"Adams, OH":["39001"],"Allen, OH":["39003"]} }, {"dimensionName": "Industry", "map": {"Crop Production":["111000"]} } ] }据我所见,一切都是完全相同的,解释器将JSON输出为单引号(')而不是双引号("),但根据我的记忆,请求模块接收相同的有效负载。
我觉得我错过了一些明目张胆的愚蠢和明显的东西,但在这一点上,我已经尝试了我的工具腰带中的每一个技巧。
发布于 2020-08-18 04:56:44
问题是,当您读取JSON文件时,json.load会返回一个Python dict。然后,当您使用它作为f-string的输入时,您只是获得了该dict的Python表示,而不是一个有效的JSON对象-正如您已经注意到的,它被表示为单引号,这在JSON中是无效的- JSON对于单引号和双引号非常挑剔。
您可以使用json.dumps(counties)而不是counties。
然而,我建议你做一些不同的事情。不需要操作字符串来创建JSON对象,而是在Python中完成这项工作,然后根据需要转换为JSON。这就是json库为您提供的帮助!
例如,您可以执行以下操作,这要简单得多:
metrics = json.loads('[{"name": "Jobs.2019" }, {"name": "Jobs.2018"}, {"name": "Jobs.2017"}, {"name": "Jobs.2016"}, {"name": "Jobs.2015"}, {"name": "Jobs.2020"}, {"name": "Estab.2019" }, {"name": "Estab.2018"}, {"name": "Estab.2017"}, {"name": "Estab.2016"}, {"name": "Estab.2015"}, {"name": "Estab.2014"}, {"name": "EPW.2019"}, {"name": "EPW.2018"}, {"name": "EPW.2017"}, {"name": "EPW.2016"}, {"name": "EPW.2015"}, {"name": "EPW.2014"}]')
payload = {"metrics": metrics,
"constraints": [{"dimensionName": "Area",
"map": counties},
{"dimensionName": "Industry",
"map": {"Crop Production": ["111000"]}}]}
result = requests.post(url, headers=headers, json=payload)https://stackoverflow.com/questions/63457949
复制相似问题