我使用Python测试来转换curl以获取一些数据。
import requests
import json
username="abc"
password="123"
headers = {
'Content-Type': 'application/json',
}
params = (
('version', '2017-05-01'),
)
data = '{"text":["This is message one."], "id":"en-es"}'
response = requests.post('https://somegateway.service/api/abc', headers=headers, params=params, data=data, auth=(username, password))
print(response.text)
以上工作正常。它返回json数据。 似乎[“这是消息一。”]是一个列表。我想使用一个加载文件的变量来替换这个列表。 我试过了:
with open(f,"r",encoding='utf-8') as fp:
file_in_list=fp.read().splitlines()
toStr=str(file_in_list)
data = '{"text":'+toStr+', "id":"en-es"}'
response = requests.post('https://somegateway.service/api/abc', headers=headers, params=params, data=data, auth=(username, password))
print(response.text)
但它在下面返回了错误。
{
"code" : 400,
"error" : "Mapping error, invalid JSON"
}
你能帮忙吗?我怎样才能有有效的response.text?
感谢。
更新
f的内容仅包含以下五行:
This is message one.
this is 2.
this is three.
this is four.
this is five.
答案 0 :(得分:1)
您现有代码失败的原因是应用于字符串列表的str
很少会为您提供有效的JSON。他们并不打算做同样的事情。 JSON只允许使用双引号字符串; Python允许单引号和双引号字符串。并且,除非您的字符串都包含'
个字符,否则Python将使用单引号呈现它们:
>>> print(["abc'def"]) # gives you valid JSON, but only by accident
["abc'def"]
>>> print(["abc"]) # does not give you valid JSON
['abc']
如果您想获得字符串列表的有效JSON编码,请不要试图欺骗str
偶然为您提供有效的JSON,只需使用json
模块:< / p>
toStr = json.dumps(file_in_list)
但是,更简单的说,你不应该试图弄清楚如何构建JSON字符串。只需创建一个dict并json.dumps
整个事情:
data = {"text": file_in_list, "id": "en-es"}
data_str = json.dumps(data)
能够做到这一点几乎是JSON的重点:它是一种自动序列化所有主要脚本语言共有的所有类型的简单方法。
或者,更好的是,让requests
通过传递json
参数而不是data
参数来为您完成:
data = {"text": file_in_list, "id": "en-es"}
response = requests.post('https://somegateway.service/api/abc', headers=headers, params=params, json=data, auth=(username, password))
这也会自动为您设置Content-Type
标题为application/json
。你没有这样做 - 虽然许多服务器会在没有它的情况下接受你的输入,但它是非法的,有些服务器不会允许它。
有关详细信息,请参阅requests
文档中的More complicated POST requests部分。但实际上还没有更多的细节。
答案 1 :(得分:-1)
toStr = json.dumps(file_in_list)
假设您的文件包含类似的内容
String_A
String_B
您需要确保toStr为:
[
和]
所以你的原始json(作为一个字符串)等于'{"text":["String_A", "String_B"], "id":"en-es"}'