Tengo una base de datos Postgres donde OrderedDict
se ha guardado como una cadena. Necesito convertir esta cadena en json / dict para que pueda guardarse en un JSONField. ¿Cómo puedo convertir esta cadena en dict?
Ejemplo de cadena:
OrderedDict([('order_id', 'xxxxxx'), ('tracking_id', 'xxxxxx'), ('bank_ref_no', 'xxxxx'), ('order_status', 'Success')])
Intenté json.loads(string)
pero da un error de decodificación. ¿Alguna solución aparte de analizar manualmente la cadena?
3 respuestas
Puede usar eval
para este propósito.
from collections import OrderedDict
import json
x = "OrderedDict([('order_id', 'xxxxxx'), ('tracking_id', 'xxxxxx'), ('bank_ref_no', 'xxxxx'), ('order_status', 'Success')])"
#run string through eval and convert to dict
dct = dict(eval(x))
print(dct)
La salida será
{'order_id': 'xxxxxx', 'tracking_id': 'xxxxxx',
'bank_ref_no': 'xxxxx', 'order_status': 'Success'}
Otro enfoque es usar Regex para extraer la lista y luego usar el módulo ast
.
Ej:
import re
import ast
from collections import OrderedDict
s = """OrderedDict([('order_id', 'xxxxxx'), ('tracking_id', 'xxxxxx'), ('bank_ref_no', 'xxxxx'), ('order_status', 'Success')])"""
print(OrderedDict(ast.literal_eval(re.search(r"(?<=OrderedDict\()(.*)\)$", s).group(1))))
Salida:
OrderedDict([('order_id', 'xxxxxx'), ('tracking_id', 'xxxxxx'), ('bank_ref_no', 'xxxxx'), ('order_status', 'Success')])
Sé que mencionaste que quieres una solución sin un análisis real, pero la opción de análisis también podría ser bastante simple:
import ast
a = "OrderedDict([('order_id', 'xxxxxx'), ('tracking_id', 'xxxxxx'), ('bank_ref_no', 'xxxxx'), ('order_status', 'Success')])"
# get the inner list representation
a = a.replace("OrderedDict(", '')
a = a[:-1]
# convert to a list of tuples
x = ast.literal_eval(a)
dict(x)
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.