Estoy haciendo una llamada a la API e intento almacenar su respuesta en Postgres usando modelos de Django. Esto es lo que he estado haciendo:
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() Pero esto solía fallar, cuando mi json tenía campos como 'field_name': '\x00\x00\x00\x00\x00' . Solía dar el siguiente error:
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":...Cómo traté de resolver esto es usando lo siguiente:
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() El problema inicial se resolvió entonces. Pero recientemente, cuando obtuve un campo con el valor 'field2_name': 'Hey "Whats up"' . Esta cosa falló al dar error:
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 143 (char 142) Probablemente porque json.loads() se confundió con " dentro del valor como un adjunto " y no como un escape " .
Ahora, si imprimo la respuesta inicial justo después json.loads(response.content.decode('utf-8')) , muestra el campo como \x00\x00\x00\x00\x00 .
Pero salida del siguiente código:
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)) Esto muestra el campo como \\u0000\\u0000\\u0000\\u0000\\u0000 . ¿Cómo cambia \x00 a \\u0000
¿Y cómo guardo este campo en tablas de postgres? Esto es lo que podría pensar.
json.loads(json.dumps(response_data).replace('\\u0000',''))Para agregar esta declaración antes de guardar en postgres.
¿Hay una mejor manera?
¿El código response_data = json.loads(response.content.decode('utf-8')) incorrecto? ¿O haciendo que no se escape ese personaje en particular?
FWIW, recientemente me encontré con esto y su solución propuesta también funcionó para mí. Creo que es probablemente la forma más sencilla de lidiar con eso. Aparentemente , este es el único carácter que no puede entrar en una columna JSON de Postgres .
json.loads(json.dumps(response_data).replace('\\u0000',''))