字符串如何转为字典格式
字符串中的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 yamlcontent="{a: 1, b: djhdj, c: [d: 34]}"yaml.safe_load(content)
2)使用demjson
import demjsoncontent="{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
