【1.66】 json 模块 用于字符串 和 python数据类型间进行转换(字符串)

 

什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化

为什么要序列化????
比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来。 但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中。 你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢? 没错序列化的过程就是从dic 变成str(dic)的过程。现在你可以通过str(dic),将一个名为dic的字典转换成一个字符串, 但是你要怎么把一个字符串转换成字典呢? 聪明的你肯定想到了eval(),如果我们将一个字符串类型的字典str_dic传给eval,就会得到一个返回的字典类型了。 eval()函数十分强大,但是eval是做什么的?e官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。 BUT!强大的函数有代价。安全性是其最大的缺点。 想象一下,如果我们从文件中读出的不是一个数据结构,而是一句"删除文件"类似的破坏性语句,那么后果实在不堪设设想。 而使用eval就要担这个风险。 所以,我们并不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构)

序列化的目的


1、以某种存储形式使自定义对象持久化

2、将对象从一个地方传递到另一个地方。

3、使程序更具维护性。

 
 
Python可序列化的数据类型
 
| Python      |     JSON      |

| dict           |     object    |

| list, tuple   |     array     |

| str             |     string    |

| int, float     |    number  |

| True           |      true     |

| False          |      false     |
 
| None          |       null     |

Python可序列化的数据类型
 

 

 

 

 

#json
import json
#json 就是不同语言的桥梁  传递数据
#向文本里面传递一个字典
#存储字典的一个文本  test.txt
dic_name={"name":"yaoming","age":"18"}
with open("test.txt","w+",encoding="utf-8") as f:
    f.write(str(dic_name))

#文本中内容 {'name': 'yaoming', 'age': '18'}
    print(f.tell())
    f.seek(0)
    data = f.read()
    print(data)   #{'name': 'yaoming', 'age': '18'}


dic_name={"name":"yaoming","age":"18"}
data_json=json.dumps(dic_name)
with open("test.txt","w+",encoding="utf-8") as f:
    f.write(data_json)
    f.seek(0)
    data_read = f.read()
    print(data_read)  #{"name": "yaoming", "age": "18"}


#这里json.dumps 是 将字典中变成json字符串
#现将 字典中不是双引号的字符串 变成双引号  然后在把字典变成json字符串

#整型  字符串  列表  通过 json.dumps 变成 json 字符串(就还是双引号的字符串)

#eval  可以取出整型 字符串 列表  字典
#json 可以转化整型 字符串 列表  字典  函数 但是不能转化类  能在任何语言之间使用
#pickle  可以转化任何类型数据  但是只能在python之间使用



#用json 存储字典   json 取出来就是字典
dic_name = {"name": "yaoming", "age": "18"}
data_chang_json = json.dumps(dic_name)
with open("test.txt", "w+", encoding="utf-8") as f:
    f.write(data_chang_json)
    f.seek(0)
    data_read = f.read()
    print(data_read,type(data_read))  # {"name": "yaoming", "age": "18"} <class 'str'>
    f.seek(0)
    data_json_read = json.loads(f.read())
    print(data_json_read,type(data_json_read))    #{'name': 'yaoming', 'age': '18'} <class 'dict'>

 

posted @ 2016-04-19 23:19  科学小怪癖  阅读(176)  评论(0)    收藏  举报