我知道要将字典转换成字符串,我会使用json.loads
和json.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",所以我想考虑两者。
答案 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'}]