Reputation: 635
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?
Upvotes: 5
Views: 6920
Reputation: 82765
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')])
Upvotes: 0
Reputation: 1440
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)
Upvotes: 3
Reputation: 20490
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'}
Upvotes: 11