![4275ec94530fa731f5f2b7ac4cc0d8e6.png](https://i-blog.csdnimg.cn/blog_migrate/5c5d9dd5b41befeb381e10a9134be5ff.jpeg)
问题:需要将一个 Python
的字符串转为字典,比如字符串:
user_info = '{"name" : "john", "gender" : "male", "age": 28}'
想把它转为下面的字典:
user_dict = {"name" : "john", "gender" : "male", "age": 28}
有以下几种方法:
通过 json
来转换
#!/usr/bin/env python
import json
user_info= '{"name" : "john", "gender" : "male", "age": 28}'
user_dict = json.loads(user_info)
print(user_dict)
{'name': 'john', 'gender': 'male', 'age': 28}
但是使用 json
进行转换存在一个潜在的问题。
由于 json
语法规定 数组或对象之中的字符串必须使用双引号,不能使用单引号 (官网上有一段描述是 “A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes” ),因此下面的转换是错误的:
import json
user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}"
# 由于字符串使用单引号,会导致运行出错
user_dict = json.loads(user_info)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes:
line 1 column 2 (char 1)
通过 eval
user_info = '{"name" : "john", "gender" : "male", "age": 28}'
user_dict = eval(user_info)
print(user_dict)
{'name': 'john', 'gender': 'male', 'age': 28}
# 注意单双引号的位置
user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}"
user_dict = eval(user_info)
print(user_dict)
{'name': 'john', 'gender': 'male', 'age': 28}
通过 literal_eval
import ast
user = '{"name" : "john", "gender" : "male", "age": 28}'
user_dict = ast.literal_eval(user)
print(user_dict)
{'name': 'john', 'gender': 'male', 'age': 28}
import ast
user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}"
user_dict = ast.literal_eval(user_info)
print(user_dict)
{'name': 'john', 'gender': 'male', 'age': 28}
使用 ast.literal_eval
进行转换既不存在使用 json 进行转换的问题,也不存在使用 eval 进行转换的 安全性问题,因此推荐使用 ast.literal_eval
。