如何在Python中返回这个有效的json数据?

时间:2018-06-16 03:21:26

标签: python json curl python-requests

我使用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.

2 个答案:

答案 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)

tldr;

toStr = json.dumps(file_in_list)

解释

假设您的文件包含类似的内容 String_A String_B

您需要确保toStr为:

  1. []
  2. 附上
  3. 列表中的每个字符串都用引号括起来。
  4. 所以你的原始json(作为一个字符串)等于'{"text":["String_A", "String_B"], "id":"en-es"}'