十分钟入门常用的json库
JSON (JavaScript Object Notation) is a subset of JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data interchange format.
JSON是python内置的序列化工具,说的通俗一点,能让字符串类型的数据与Python基本数据类型(列表、字典、字符串、整数、布尔,其他类型不能json的)互相切换,非常便捷方便。在之前写爬虫时候实际上我们已经接触过JSON,今天我们认真学习一下json库。
json官网
序列化
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据。
如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。
常用方法
方法 | 说明 |
---|---|
json.dumps(obj) | 将Python的基本数据类型序列化成字符串 |
json.loads(obj) | 将字符串序列化成Python的基本数据类型,注意单引号与双引号 |
一、json.dumps
将python类型对象序列化为字符串
这样有啥用呢?
比如进行一次很消耗时间的计算,步骤依次为a>b>c>d>e。正常来说为了得到e,我们必须从a开始,依次运行直到运行到e为止得到我们需要的e。
但是通过dump,我们可以把a、b、c、d、e每个步骤的运行情况全部dump下来,这样如果程序在c出错,我们不用从a开始,只需要从c开始即可。而想实现这功能,可以使用dump,将各种对象dump保存下来
1.1 dict
import json
dict_obj = {'key1':'value1','key2':'value2'}
#打印dict_obj类型
print('dict_obj:'type(dict_obj))
#将python的dict对象 序列化为字符串
dict_str = json.dumps(dict_obj)
print('dict_str:',type(dict_str))
<class 'dict'> dict_obj
<class 'str'> dict_str
1.2 list
list_obj = "[1,2,3,4,4]"
print('list_obj:',type(list_obj))
#将python的list对象 序列化为字符串
list_str = json.loads(list_obj)
print('list_str:', type(list_str))
list_obj: <class 'str'>
list_str: <class 'list'>
1.3 int
int_obj = 1234
print('int_obj:',type(int_obj))
#将python的list对象 序列化为字符串
int_str = json.dumps(int_obj)
print('int_str:', type(int_str))
int_obj: <class 'int'>
int_str: <class 'str'>
二、json.loads
将字符串序列化为python类型对象
2.1 dict_str
import json
dict_str = '{"k1":"v1","k2":"v2"}'
print('dict_str:',type(dict_str))
dict_obj = json.loads(dict_str)
print('dict_obj:',type(dict_obj))
#判断dict_str与dict_obj是否相同
print(dict_str == dict_obj)
#试验下转化后的dictobj字典特性
print(dict_obj['k1'])
dict_str: <class 'str'>
dict_obj: <class 'dict'>
False
v1
2.2 int_str
int_str = "1234"
print('int_str:',type(int_str))
int_obj = json.loads(int_str)
print('int_obj:',type(int_obj))
#判断int_str与int_obj是否相同
print(int_str == int_obj)
#试验下int_obj列表特性
print(int_obj*3)
int_str: <class 'str'>
int_obj: <class 'int'>
False
3702
2.3 list_str
list_str = "[1,2,3,4,4]"
print('list_str:',type(list_str))
list_obj = json.loads(list_str)
print('list_obj:', type(list_obj))
#判断list_str与list_obj是否相同
print(list_str==list_obj)
#检查下list_obj是否具有集合特性
print(list_obj.count(4))
print(list_obj+[1,2,3])
list_str: <class 'str'>
list_obj: <class 'list'>
False
2
[1, 2, 3, 4, 4, 1, 2, 3]
a = set()a.add('a')a.add('c')print(a)
{'a', 'c'}
s = json.loads('1')print(type(s))
<class 'int'>
二、文件上的json操作
上面我们已经了解了dumps和loads各自的功能,现在我们在学习下dump和load,他们可以在文件(txt、json、db数据库等)上进行json操作。这里我们以字典为例:
2.1dump操作
这里我建议大家不适用json库提供dump写入文件操作,因为大家自己都很熟悉open写入操作,而且自己熟悉的open写起来很方便好用。
2.1.1 open写入txt
open写入,相当于json.dump(str,file)
import json
import os
#注意字典中的元素使用双引号
dict_obj1= {"key1":"value1","key2":"value2"}
dict_obj2 = {"key2":"value2","key3":"value"}
#将python的dict对象 序列化为字符串,并写入
with open('test.txt','w') as fp:
dict_str1 = json.dumps(dict_obj)
#换行,方便后续load
fp.write(dict_str1+"\n")
dict_str2 = json.dumps(dict_obj)
fp.write(dict_str2+"\n")
2.1.2 open写入json文件
dict2_obj1 = {"china":"asian","england":"euro"}
dict2_obj2 = {"chinasss":"asian","england":"euro"}
#将python的dict对象 序列化为字符串,并写入
with open('test.json','w') as fp:
dict2_str1 = json.dumps(dict2_obj1)
dict2_str1 = json.dumps(dict2_obj1)
fp.write(dict2_str1+"\n")
fp.write(dict2_str2+"\n")
2.1.3 open写入db文件
dict2_obj1 = {"china":"asian","england":"euro"}
dict2_obj2 = {"chinasss":"asian","england":"euro"}
#将python的dict对象 序列化为字符串,并写入
with open('test.db','w') as fp:
dict2_str1 = json.dumps(dict2_obj1)
dict2_str2 = json.dumps(dict2_obj1)
fp.write(dict2_str1+"\n")
fp.write(dict2_str2+"\n")
2.2 文件上的load操作
在这里,load相当于open()的read方法
with open('test.db','r') as f:
#with open('test.json','r') as f:
#with open('test.txt','r') as f:
for line in f.readlines():
dd = json.loads(line)
print(dd,type(dd))
{'china': 'asian', 'england': 'euro'} <class 'dict'>
{'china': 'asian', 'england': 'euro'} <class 'dict'>
注意:
从文件中读取时是一行行取数据的
字典全部使用双引号,这一点要牢牢记住!!!
历史文章:
数据采集
【视频】有了selenium,小白也可以自豪的说:“去TMD的抓包、cookie”
【视频】快来get新技能--抓包+cookie,爬微博不再是梦