ezv*_*ine 1 python django postgresql django-models python-3.x
我正在进行 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()
Run Code Online (Sandbox Code Playgroud)
但是当我的 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":...
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下方法解决此问题:
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()
Run Code Online (Sandbox Code Playgroud)
那么最初的问题就解决了。但最近,当我得到一个有价值的字段时'field2_name': 'Hey "Whats up"'
。这件事失败了,给出了错误:
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 143 (char 142)
Run Code Online (Sandbox Code Playgroud)
"
可能是因为 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))
Run Code Online (Sandbox Code Playgroud)
这将该字段显示为\\u0000\\u0000\\u0000\\u0000\\u0000
。怎么\x00
改成\\u0000
我如何将该字段保存到 postgres 表中?这是我能想到的。
json.loads(json.dumps(response_data).replace('\\u0000',''))
Run Code Online (Sandbox Code Playgroud)
在保存到 postgres 之前添加此语句。
有没有更好的办法 ?
代码response_data = json.loads(response.content.decode('utf-8'))
有错吗?或者导致不逃避该特定字符?
FWIW,我最近遇到了这个问题,您提出的解决方案也对我有用。我认为这可能是处理它的最简单的方法。显然这是唯一不能进入 Postgres JSON 列的字符。
json.loads(json.dumps(response_data).replace('\\u0000',''))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2592 次 |
最近记录: |