【问题标题】:Python convert OrderedDict saved as string into an actual dictPython将作为字符串保存的OrderedDict转换为实际的dict
【发布时间】:2019-09-28 00:45:31
【问题描述】:

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

字符串示例 -

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

我尝试了json.loads(string),但它给出了解码错误。除了手动解析字符串还有什么解决办法?

【问题讨论】:

  • eval(string) ?
  • @furas 我通常会尽量避免使用eval,因为它看起来不安全。但在这种情况下,我想应该没问题
  • 我也会避免使用eval,但使用regexsplit() 需要更多的工作,而且它不能预测所有情况。

标签: python json ordereddict


【解决方案1】:

您可以为此使用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'}

【讨论】:

    【解决方案2】:

    我知道您提到您想要一个没有实际解析的解决方案,但解析选项也可能非常简单:

    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】:

      另一种方法是使用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')])
      

      【讨论】:

        猜你喜欢
        • 2019-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 2019-10-22
        • 1970-01-01
        相关资源
        最近更新 更多