繁体   English   中英

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

[英]How to return this valid json data in Python?

我测试了使用Python转换卷曲以获得一些数据的能力。

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.

现有代码失败的原因是,将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模块即可:

toStr = json.dumps(file_in_list)

但是,更简单地说,您不应该首先弄清楚如何构造JSON字符串。 只需创建一个字典并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文档中的“ 更复杂的POST请求 ”部分。 但是实际上没有更多细节。

tldr;

toStr = json.dumps(file_in_list)

说明

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

您需要确保toStr为:

  1. []括起来
  2. 列表中的每个字符串都用引号引起来。

因此,您的原始json(作为字符串)等于'{"text":["String_A", "String_B"], "id":"en-es"}'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM