将字符串化的字典列表转换回字典列表

Rob*_*ley 4 python json python-3.x

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

sample_entry = [
    {"type": "test", "topic": "obama", "interval": "daily"},
    {"type": "test", "topic": "biden", "interval": "immediate"},
]
Run Code Online (Sandbox Code Playgroud)

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

"[{'topic': 'obama', 'interval': 'daily', 'type': 'test'}, {'topic': 'biden', 'interval': 'immediate', 'type': 'test'}]"
Run Code Online (Sandbox Code Playgroud)

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

是否有另一种方法可以在面对不同的列表长度和可变的空白时保持稳健?

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

Moi*_*dri 5

您可以使用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'}]
Run Code Online (Sandbox Code Playgroud)

根据ast.literal_eval文档,它:

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


Kev*_*vin 5

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

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

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

>>> 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'}]
Run Code Online (Sandbox Code Playgroud)