Python 将数据帧行转换为JSON模式,然后发出POST请求 我有一个JSON格式的数据集,如下所示: 我需要循环并发送以下各项: 对于这样的POST请求: 编辑/更新
希望这是一个更完整的例子,我正试图这样做。我有一个包含公司名称和员工的数据框架,如下所示:Python 将数据帧行转换为JSON模式,然后发出POST请求 我有一个JSON格式的数据集,如下所示: 我需要循环并发送以下各项: 对于这样的POST请求: 编辑/更新,python,json,pandas,python-requests,Python,Json,Pandas,Python Requests,希望这是一个更完整的例子,我正试图这样做。我有一个包含公司名称和员工的数据框架,如下所示: >>> print name_frame ... name name name name name Micro inc. NaN Jim D Susan A NaN NaN Vitacore Billy B NaN Sally Q Mark G NaN
>>> print name_frame
...
name name name name name
Micro inc. NaN Jim D Susan A NaN NaN
Vitacore Billy B NaN Sally Q Mark G NaN
finalJSON = {
"company":{
"name": "Micro inc.",
"founders": {
"name": "Jim D",
"name": "Susan A",
}
}
"company":{
"name": "Vitacore",
"founders": {
"name": "Billy B",
"name": "Sall Q",
"name":"Mark G",
}
我需要做的是将其转换为JSON格式,如下所示:
>>> print name_frame
...
name name name name name
Micro inc. NaN Jim D Susan A NaN NaN
Vitacore Billy B NaN Sally Q Mark G NaN
finalJSON = {
"company":{
"name": "Micro inc.",
"founders": {
"name": "Jim D",
"name": "Susan A",
}
}
"company":{
"name": "Vitacore",
"founders": {
"name": "Billy B",
"name": "Sall Q",
"name":"Mark G",
}
在一次询问中,我被建议尝试此方法以获得所需的JSON格式:
finalJSON = []
for company, names in df.iterrows():
names = ['"{0}"'.format(name) for name in names.dropna().tolist()]
names_json_str = ('"name": ' if names else '') + ', "name": '.join(names)
finalJSON.append('"company": {"name": "' + company + '", "founders": {' + names_json_str + '}')
finalJSON = ', '.join(finalJSON)
>>> finalJSON
'"company": {"name": "Micro inc.", "founders": {"name": "Jim D", "name": "Susan A"},
"company": {"name": "Vitacore", "founders": {"name": "Billy B", "name": "Sally Q", "name": "Mark G"}'
现在我正在将转换与post请求集成:
for company, names in name_frame.iterrows():
names = ['"{0}"'.format(name) for name in names.dropna().tolist()]
names_json_str = ('"name": ' if names else '') + ', "name": '.join(names)
payload = '"company": {"name": "' + company + '", "founders": {' + names_json_str + '}'
p = requests.post((url), json=payload, headers=headers)
if(p.status_code == 200):
print p.text
d.append(p.text)
else:
print(p.status_code)
print "Error"
尽管事实上负载不被认为是JSON可序列化的
TypeError: set([' + names_json_str + ']) is not JSON serializable
如何格式化json字符串完全取决于服务器的要求 如果服务器接受公司json字符串为:
{"company": {"name": "Micro inc.", "founders": ["Jim D", "Susan A"]}}
您可以执行以下操作:
finalJSON = []
rows = [('Micro inc.', ('Jim D', 'Susan A')),
('Vitacore', ('Billy B', 'Sally Q', 'Mark G'))]
for company_name, founders in rows:
# replace rows with real data, e.g. df.iterrows()
founders = ', '.join('"{}"'.format(founder) for founder in founders)
json_str = '{{"company": {{"name": "{}", "founders": [{}]}}}}'.format(company_name, founders)
finalJSON.append(json_str)
for company in finalJSON:
print(company)
# do stuff with company
所以基本上是这样的:
payload = '"company": {"name": "' + company + '", "founders": {' + names_json_str + '}'
API的格式错误,修复后解决了问题
finalJSON
实际上不是有效的JSON值。此外,作为一个字符串,company
一次只分配给该字符串中的一个字符。@chepner这是因为重复的键吗?这是有效的JSON格式,尽管很奇怪。您对如何选择我指定的项目有什么想法吗?您需要更改构建finalJSON
的方式。您可能需要一个字符串列表,每个字符串包含1个公司的JSON数据。请注意,当前每个公司条目都缺少右大括号。@PM2Ring的格式正确:{“公司”:{“名称”:“公司”,“创始人”:{“名称”:“乔”}}}}是的,看起来不错。但是看看你问题中的其他内容,在JSON对象中重复使用键不是一个好主意,比如{“name”:“Jim D”,“name”:“Susan a”}
。JSON允许这样做,但是当JSON对象被转换为Python dict时,正确处理它是一件痛苦的事情。我刚刚更新了我的问题,给出了我尝试做什么的完整上下文。我认为我如何将pandas DataFrame对象转换为请求的条目有点不对劲。我尝试了您推荐的代码,但不幸的是,在post中使用时,API不接受循环中的公司request@cgclip这是意料之中的。作为API的用户,您应该知道格式要求。我只提供一个例子。
payload = '"company": {"name": "' + company + '", "founders": {' + names_json_str + '}'