字符串如何转为字典格式
字符串中的key带有引号,怎么转换为字典格式?
1、通过 json 来转换
>>> import json
>>> user_info= '{"name" : "john", "gender" : "male", "age": 28}'
>>> user_dict = json.loads(user_info)
>>> user_dict
{u'gender': u'male', u'age': 28, u'name': u'john'}
但是使用 json
进行转换存在一个潜在的问题:数组或对象之中的字符串必须使用双引号,不能使用单引号
2、通过 eval
>>> user_info = '{"name" : "john", "gender" : "male", "age": 28}'
>>> user_dict = eval(user_info)
>>> user_dict
{'gender': 'male', 'age': 28, 'name': 'john'}
>>> user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}"
>>> user_dict = eval(user_info)
>>> user_dict
{'gender': 'male', 'age': 28, 'name': 'john'}
通过 eval
进行转换就不存在上面使用 json
进行转换的问题。但是,使用 eval
却存在安全性的问题
3、通过 literal_eval
>>> import ast
>>> user = '{"name" : "john", "gender" : "male", "age": 28}'
>>> user_dict = ast.literal_eval(user)
>>> user_dict
{'gender': 'male', 'age': 28, 'name': 'john'}
user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}"
>>> user_dict = ast.literal_eval(user)
>>> user_dict
{'gender': 'male', 'age': 28, 'name': 'john'}
使用 ast.literal_eval
进行转换既不存在使用 json
进行转换的问题,也不存在使用 eval
进行转换的 安全性问题
,因此推荐使用 ast.literal_eval
。
如果字符串中的key没有引号怎么转换为字典:
1)使用yaml
import yaml
content="{a: 1, b: djhdj, c: [d: 34]}"
yaml.safe_load(content)
2)使用demjson
import demjson
content="{a: 1, b: djhdj, c: [d: 34]}"
dict = demjson.decode(content)
3)使用函数直接变为字典
def jsonfy(s: str) -> object:
obj = eval(s, type('js', (dict,), dict(__getitem__=lambda s, n: n))())
return obj