将保存为字符串的有序字典(OrderedDict)转换为实际字典的 Python 方法

5

我有一个Postgres数据库,其中保存了OrderedDict作为字符串。 我需要将此字符串转换为json / dict,以便可以将其保存在JSONField中。 如何将此字符串转换为字典?

字符串示例 -

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

我尝试使用json.loads(string),但出现解码错误。 除手动解析字符串之外还有其他解决方法吗?


3
eval(string) - furas
@furas 我一般尽量避免使用eval,因为它看起来不安全。但在这种情况下,我想应该没问题。 - Garvit Jain
我也会避免使用 eval,但是使用 regexsplit() 需要更多的工作,并且不能预测所有情况。 - furas
3个回答

11

您可以使用eval来实现此目的。

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)

输出结果将会是

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

3

我知道您提到您希望有一种不需要实际解析的解决方案,但解析选项也可以非常简单:

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)

0
另一种方法是使用正则表达式提取列表,然后使用ast模块。 例如:
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))))

输出:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接