背景:
在学习Django时候,根据输入的json数据,后端再将数据进行存储,发现后端读取出来的json数据是字符串类型的,即使我使用json.loads()方法来转化也没有转成字典类型
我这就意识到不得不总结记录下。
使用json.loads()进行转化
data='{"name":"fancy","age":18,"home":"china"}' json_data=json.loads(data) print("json转化成字典",json_data) print("json转化成字典的类型",type(json_data))
结果:
json转化成字典 {'name': 'fancy', 'age': 18, 'home': 'china'}
json转化成字典的类型 <class 'dict'>
使用eval()进行转化
data='{"name":"fancy","age":18,"home":"china"}' dic_data=eval(data) print("使用eval转化成字典",dic_data) print("使用eval转化成字典的类型",type(dic_data))
结果:
使用eval转化成字典 {'name': 'fancy', 'age': 18, 'home': 'china'}
使用eval转化成字典的类型 <class 'dict'>
但是,eval()虽然方便,可存在安全问题,因为它不管你输入的是什么内容,都会转成python可以识别的类型
比如这段代码:
input_info=input("os.path.realpath(__file__)") dic_data=eval(input_info)
输出结果就是: 使用eval转化成字典 /Users/xmly/Desktop/tools/05_jiami/基础知识.py
可想而知,如果输入的是获取数据的代码指令或者是删除数据的指令,那么就存在比较严重的安全隐患了
后面我们可以使用ast.literal_eval()方法
使用ast.literal_eval()进行转化
如果使用ast.literal_eval()再执行上面的操作:
input_info=input("os.path.realpath(__file__)") dic_data=ast.literal_eval(input_info)
程序会报错,就遏制了不安全的指令输入:
正常转化字符串:
data='{"name":"fancy","age":18,"home":"china"}' dic_data=ast.literal_eval(data) print("使用literal_eval转化成字典",dic_data) print("使用literal_eval转化成字典的类型",type(dic_data))
结果:
使用literal_eval转化成字典 {'name': 'fancy', 'age': 18, 'home': 'china'}
使用literal_eval转化成字典的类型 <class 'dict'>