Python 请求 Json 正文包含一些泰语值,需要按原样编码
Posted
技术标签:
【中文标题】Python 请求 Json 正文包含一些泰语值,需要按原样编码【英文标题】:Python requests Json body includes some thai values, needs to be encoded as it is 【发布时间】:2019-09-06 13:13:26 【问题描述】:我有一些 json 包含一些 thai
值。它看起来像
"TitleName": "คุณ",
"FirstName": "Simar"
我需要用这个带有确切thai
值的json 主体发出一个Http POST 请求。我正在使用Python 3 requests
库来发出请求。
我试过这个
headers =
'Content-Type': "application/json",
'Authorization': "xxx",
'cache-control': "no-cache",
'Postman-Token': "xxx"
response = requests.request("POST", url, json=request, headers=headers)
它将json值生成为
"TitleName": "\\u0e04\\u0e38\\u0e13",
"FirstName": "Simar"
我也试过了
json_request = json.dumps(self.request_data,ensure_ascii=False).encode('utf8')
response = requests.request("POST", url, json=json_request, headers=headers)
它将json值生成为
"TitleName": "\xe0\xb8\x84\xe0\xb8\xb8\xe0\xb8\x93",
"FirstName": "Simar"
但我希望将 json 值生成为
"TitleName": "คุณ",
"FirstName": "Simar"
我们将不胜感激。提前致谢。
【问题讨论】:
为什么需要保持原样?我认为 Python 不会打印奇怪的字符(如表情符号),这并不意味着您不能在网站上使用它。 在 JSON 中,\u0e04 与 คุ 是同一个字符。 (\\u0e04 是否只是碰巧包含 JSON 的文本字符串的 Python 文字表示,可能如调试器所示?) 我想保持原样,因为我要访问的 API 仅适用于泰语值,而不适用于“\u0e04”或“\xe0”等文字 @TomBlodget 是的,我从调试器中选择了这个值 感谢您的解释。 \x 表示法不是有效的 JSON,但 \u 是。太糟糕了,您的客户不合规。我没有比@snakecharmerb 更好的解决方案(但其他人可能)。 【参考方案1】:要在 POST 请求中保留非 ascii 字符,您需要手动序列化为 json,并显式设置 content-type
标头。
data = json.dumps(my_dict, ensure_ascii=False)
r = requests.post(url, headers='content-type': 'application/json',
data=data.encode('utf-8'))
【讨论】:
我想我已经做了与问题中提到的相同的事情。但它给了我“TitleName”的值:“\xe0\xb8\x84\xe0\xb8\xb8\xe0\xb8\x93” 您可以尝试将标题设置为'application/json;charset=utf8'
吗?您的问题中有类似的代码,但是 requests 要求您在执行此操作时设置内容类型标头,并且您的问题不会显示您要发送的标头。
我已经尝试使用标题为'application/json'
以及'application/json; charset=utf8'
。但都没有奏效。
另外,我已经编辑了问题以指定使用的标题。以上是关于Python 请求 Json 正文包含一些泰语值,需要按原样编码的主要内容,如果未能解决你的问题,请参考以下文章
AWS Lambda 错误:当 url 参数包含 JSON 数组时,“无法将请求正文解析为 json”
Spring boot 的 Postman Post 请求保存了整个 JSON 正文,而不仅仅是字段值。我该如何解决?
在其 HTTP 正文中嵌套 JSON 的 RestKit 对象映射请求