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?

2
Garvit Jain 10 may. 2019 a las 09:33

3 respuestas

La mejor respuesta

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'}
4
Devesh Kumar Singh 10 may. 2019 a las 06:41

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')])
0
Rakesh 10 may. 2019 a las 06:51

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)
3
razdi 10 may. 2019 a las 06:42