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

时间:2017-03-06 16:48:47

标签: python json python-3.x

我知道要将字典转换成字符串,我会使用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",所以我想考虑两者。

3 个答案:

答案 0 :(得分:4)

  

使用str()将其转换为字符串可以得到......

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

不使用str,而是使用str()。我知道你说过你尝试了它并没有用,但是当它用在内置物体上时非常强大,所以我怀疑你可能只是偶然造成了错字。这个例子说明你完整地序列化了:

json.dumps

答案 1 :(得分:2)

您可以使用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文字结构:字符串,数字,元组,列表,dicts,布尔值和None。

答案 2 :(得分:1)

在大多数情况下,格式良好的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'}]