Python 将保存为字符串的 OrderedDict 转换为实际的字典
Python convert OrderedDict saved as string into an actual dict
我有一个 Postgres 数据库,其中 OrderedDict
已保存为字符串。我需要将此字符串转换为 json/dict 以便将其保存在 JSONField 中。如何将此字符串转换为字典?
字符串示例 -
OrderedDict([('order_id', 'xxxxxx'), ('tracking_id', 'xxxxxx'), ('bank_ref_no', 'xxxxx'), ('order_status', 'Success')])
我试过json.loads(string)
,但出现解码错误。除了手动解析字符串之外还有什么解决方案吗?
您可以使用 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'}
我知道你提到你想要一个没有实际解析的解决方案,但解析选项也可以非常简单:
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)
另一种方法是使用 Regex 提取列表,然后使用 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')])
我有一个 Postgres 数据库,其中 OrderedDict
已保存为字符串。我需要将此字符串转换为 json/dict 以便将其保存在 JSONField 中。如何将此字符串转换为字典?
字符串示例 -
OrderedDict([('order_id', 'xxxxxx'), ('tracking_id', 'xxxxxx'), ('bank_ref_no', 'xxxxx'), ('order_status', 'Success')])
我试过json.loads(string)
,但出现解码错误。除了手动解析字符串之外还有什么解决方案吗?
您可以使用 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'}
我知道你提到你想要一个没有实际解析的解决方案,但解析选项也可以非常简单:
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)
另一种方法是使用 Regex 提取列表,然后使用 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')])