【问题标题】:Convert stringified list of dictionaries back to a list of dictionaries将字符串化的字典列表转换回字典列表
【发布时间】:2017-03-06 16:48:46
【问题描述】:

我知道要将字典转换为字符串或从字符串转换,我使用json.loadsjson.dumps。但是,当给定一个表示字典列表的字符串时,这些方法会失败。例如,

sample_entry = [
    {"type": "test", "topic": "obama", "interval": "daily"},
    {"type": "test", "topic": "biden", "interval": "immediate"},
]

使用str() 将其转换为字符串给我们

"[{'topic': 'obama', 'interval': 'daily', 'type': 'test'}, {'topic': 'biden', 'interval': 'immediate', 'type': 'test'}]"

有没有一种简单的方法可以将其转换回字典列表? eval 正是我想要的,但我担心在用户提供的字符串上运行它。

在面对可变的列表长度和可变的空白区域时,是否有另一种方法可以稳健地完成此任务?

编辑:虽然 json.loads(json.dumps(sample_entry)) 确实有效,但 json.loads(str(sample_entry)) 没有。区别似乎在于使用单引号和双引号的地方。我从中接收此字符串的数据源在使用 ' vs " 时不太可能保持一致,因此我想同时考虑两者。

【问题讨论】:

  • “当给定一个表示字典列表的字符串时,这些方法会失败。” 他们会吗?怎么会这样?我刚试过json.loads(json.dumps(sample_entry)),我没有得到异常或任何东西。我觉得很好。
  • “我收到此字符串的数据源在使用 ' vs "" 时不太可能一致。好的,这更有意义。感谢您的澄清. 你对数据源了解多少?他们用 Python 吗?他们用 json 吗?你能说服他们使用更一致的语法吗?
  • 谢谢凯文,你说得对 json.loads(json.dumps(sample_entry)) 工作正常。不幸的是,我的数据源使用的方法向我发送了一个与 json.dumps() 给出的字符串不匹配的字符串。更不幸的是,这不是我要求的一致性。这是一个抓取用户提供的、javascript 格式的数据的 python 应用程序。
  • [ {"type": "test", "topic": "obama", "interval": "daily"}, {"type": "test", "topic": "biden", "interval": "immediate"}, ]如果我尝试验证Invalid JSON: Expecting value: line 4 column 1 (char 128) None [Program finished] 并且当我尝试解析[{'type': 'test', 'topic': 'obama', 'interval': 'daily'}, {'type': 'test', 'topic': 'biden', 'interval': 'immediate'}] [Program finished] 意味着这个例子是正确的。也许发布不起作用的数据

标签: python json python-3.x


【解决方案1】:

您可以使用ast.literal_eval:

>>> import ast
>>> my_str = "[{'topic': 'obama', 'interval': 'daily', 'type': 'test'}, {'topic': 'biden', 'interval': 'immediate', 'type': 'test'}]"

>>> ast.literal_eval(my_str)
[{'interval': 'daily', 'type': 'test', 'topic': 'obama'}, {'interval': 'immediate', 'type': 'test', 'topic': 'biden'}]

根据ast.literal_eval document,它:

安全地评估包含 Python 文字或容器显示的表达式节点或 Unicode 或 Latin-1 编码字符串。提供的字符串或节点只能由以下 Python 文字结构组成:字符串、数字、元组、列表、字典、布尔值和无。

【讨论】:

    【解决方案2】:

    使用 str() 将其转换为字符串会给我们...

    你的问题就在那里。您不应该使用str 来序列化数据。无法保证生成的字符串可以恢复到原始对象中。

    不要使用str(),而是使用json.dumps。我知道你说你试过了,但它没有用,但在内置对象上使用时它非常健壮,所以我怀疑你可能只是不小心打错了字。您提供的示例字典完美地序列化:

    >>> sample_entry = [
    ...     {"type": "test", "topic": "obama", "interval": "daily"},
    ...     {"type": "test", "topic": "biden", "interval": "immediate"},
    ... ]
    >>>
    >>> s = json.dumps(sample_entry)
    >>> print(s)
    [{"interval": "daily", "topic": "obama", "type": "test"}, {"interval": "immediate", "topic": "biden", "type": "test"}]
    >>>
    >>> d = json.loads(s)
    >>> d
    [{'interval': 'daily', 'topic': 'obama', 'type': 'test'}, {'interval': 'immediate', 'topic': 'biden', 'type': 'test'}]
    

    【讨论】:

      【解决方案3】:

      格式良好的 python 数据类型在大多数情况下可以使用ast.literal_eval 进行解释

      import ast
      ast.literal_eval("[{'topic': 'obama', 'interval': 'daily', 'type': 'test'}, {'topic': 'biden', 'interval': 'immediate', 'type': 'test'}]")
      Out[38]: 
      [{'interval': 'daily', 'topic': 'obama', 'type': 'test'},
       {'interval': 'immediate', 'topic': 'biden', 'type': 'test'}]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-12
        • 2014-05-23
        • 2019-05-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多