如何处理数据中包含\x00(或\u0000)的API响应(JSON),并使用Django模型将数据存储在Postgres中?

2024-10-04 01:31:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在进行一个api调用,并尝试使用Django模型将其响应存储在Postgres中。 以下是我一直在做的事情:

response = requests.post(url='some.url.com', data=json.dumps(data), headers={'some': 'header'})
response_data = json.loads(response.content.decode('utf-8'))
#handler is a object of a model
handler.api_response = response_data
handler.save()

但是,当我的json有类似'field_name': '\x00\x00\x00\x00\x00'的字段时,这通常会失败。它通常会给出以下错误:

DataError at /api/booking/reprice/
unsupported Unicode escape sequence
LINE 1: ... NULL, "api_status" = 0, "api_response" = '{"errorRe...
                                                             ^
DETAIL:  \u0000 cannot be converted to text.
CONTEXT:  JSON data, line 1: ..."hoursConfirmed": 0, "field_name":...

我是如何通过使用以下方法来解决此问题的:

response = requests.post(url='some.url.com', data=json.dumps(data), headers={'some': 'header'})
response_data = json.loads(response.content.decode('utf-8'))
#handler is a object of a model
handler.api_response = json.loads(json.dumps(response_data).encode("unicode-escape").decode())
handler.save()

最初的问题就解决了。但最近,当我得到一个值为'field2_name': 'Hey "Whats up"'的字段时。此操作因给出错误而失败:

json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 143 (char 142)

可能是因为json.loads()与值中的"混淆为封闭的",而不是转义的"

现在,如果我在json.loads(response.content.decode('utf-8'))语句之后打印初始响应,它会将字段显示为\x00\x00\x00\x00\x00

但以下代码的输出:

response = requests.post(url='some.url.com', data=json.dumps(data), headers={'some': 'header'})
response_data = json.loads(response.content.decode('utf-8'))
print(json.dumps(response_data))

这将字段显示为\\u0000\\u0000\\u0000\\u0000\\u0000\x00如何变成\\u0000

如何将此字段保存到postgres表中? 这就是我能想到的

json.loads(json.dumps(response_data).replace('\\u0000',''))

在保存到postgres之前添加此语句

有更好的办法吗

代码response_data = json.loads(response.content.decode('utf-8'))错了吗?或者让你无法摆脱那个特殊的角色


Tags: apijsonurldataresponsesomecontentrequests