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”

nodejs从POST请求中获取原始正文[重复]

Spring boot 的 Postman Post 请求保存了整个 JSON 正文,而不仅仅是字段值。我该如何解决?

在其 HTTP 正文中嵌套 JSON 的 RestKit 对象映射请求

Charles:仅将请求正文导出为单独的 JSON 文件 [关闭]

Python请求与curl