Json模块
Json模块比较简单,仅有四个方法dumps()和loads()方法,dump()和load()方法,但是却非常的常用,实用性极强。
如果要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如xml,但更好的方法是序列化为JSON,因为json表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。
Json不仅是标准格式,而且比xml更快,还可以直接在web页面中读取,非常方便。
Json表示的对象就是标准的JavaScript语言的对象,Json和Python内置的数据类型对应如下:
Json类型 | Python内置类型 |
{} | dict |
[] | list |
"string" | str |
123/123.34 | int/float |
true/false | True / False |
null | None |
import json dic = {'name':'chen'} i = 8 s = 'hello' l = [1,2,3] # json.dumps 会把字符串里所有的单引号都变成双引号 data_dic = json.dumps(dic) # 第一步:把dic的值变成双引号,{"name":"chen"},第二步:再把这个值变成json的字符串:'{"name":"chen"}' print(data_dic) # {"name": "chen"} print(type(data_dic)) # <class 'str'> i = json.dumps(i) # 第一步:把i的值变成双引号,"8",第二步:再把这个值变成json的字符串:'"8"' print(i) # 8 print(type(i)) # <class 'str'> s = json.dumps(s) # 第一步:把s的值变成双引号,"hello",第二步:再把这个值变成json的字符串:'"hello"' print(s) # "hello" print(type(s)) # <class 'str'> l = json.dumps(l) print(l) # [1, 2, 3] print(type(l)) # <class 'str'> # 从上面的结果可以看到,json.dumps()首先会把所有数据类型的值都变成双引号(因为json只认双引号),然后再把这个值变成字符串
dumps()和loads()方法
# 上面已经把各种数据类型都通过json.dumps()方法处理成了json格式的字符串,然后把字符串写入到new_dic文件 # json.dumps()是-----序列化 dic = {'name':'chen'} dic_str = json.dumps(dic) f = open('new_dic','w', encoding = 'utf-8') f.write(dic_str) f.close # json.loads()是------反序列化 # 最后再读取new_dic内的文件 f_read = open('new_dic','r', encoding = 'utf-8') data = json.loads(f_read.read()) print(data) # {'name': 'chen'} print(type(data)) # <class 'dict'> print(data['name']) # chen
dump()和load()方法
# dump()和load()可以简化dumps()和loads()的处理过程 # 上面的如果要写一个字典到文件里,实现序列化,使用dumps()的代码如下: dic = {'name':'chen'} f = open('new_dic','w', encoding = 'utf-8') # 下面的两行会被dump()直接简化处理掉 dic_str = json.dumps(dic) f.write(dic_str) f.close() # 而如果使用dump()方法,代码如下: dic = {'name':'chen'} f = open('new_dic','w', encoding = 'utf-8') json.dump(dic,f) f.close() # 同理,如果想从文件里读取内容,实现反序列化,使用loads()代码如下: f_read = open('new_dic','r', encoding = 'utf-8') data = json.loads(f_read.read()) # 而如果使用load()方法,代码如下: f_read = open('new_dic','r', encoding = 'utf-8') data = json.load(f_read) print(data) # {'name': 'chen'} # 虽然dump()和load()可以简化dumps()和loads(),但是太定制化了,仅限于对文件的处理。 所以,建议在程序开发中还是使用dumps()和loads()方法,因为还有其他数据类型的处理呢。