简体   繁体   中英

Python convert OrderedDict saved as string into an actual dict

I have a Postgres db where OrderedDict has been saved as a string. I need to convert this string into json/dict so that it can be saved in a JSONField. How can I convert this string into dict?

String example -

OrderedDict([('order_id', 'xxxxxx'), ('tracking_id', 'xxxxxx'), ('bank_ref_no', 'xxxxx'), ('order_status', 'Success')])

I tried json.loads(string) but it gives a decoding error. Any solution apart from manually parsing the string?

You can use eval for this purpose.

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)

The output will be

{'order_id': 'xxxxxx', 'tracking_id': 'xxxxxx', 
'bank_ref_no': 'xxxxx', 'order_status': 'Success'}

I know you mentioned you want a solution without actual parsing, but the parsing option could be pretty simple too:

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)

Another approach is to use Regex to extract the list and then use ast module.

Ex:

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))))

Output:

OrderedDict([('order_id', 'xxxxxx'), ('tracking_id', 'xxxxxx'), ('bank_ref_no', 'xxxxx'), ('order_status', 'Success')])

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM