查看原文
其他

十分钟入门常用的json库

2017-11-10

作者 大邓

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驱动器配置详解

icrawler:强大简单的图片爬虫库

抓取单博主的所有微博及其评论

爬虫神器PyQuery的使用方法

pyquery一些自定义的用法

【视频】猫途鹰网站评论数据抓取

【视频讲解】在scrapy框架中如何使用selenium?

【实战视频】使用scrapy写爬虫-爬知乎live

简易SQLite3数据库学习

【视频教程】对视频进行基本操作

【视频】抓包小练习-B站评论数据抓取

fake-useragent库:值得花2分钟学习的库

【视频】爬取饿了么平台上的门店信息

如何抓取视频资源-以头条视频为例

当爬虫遭遇验证码,怎么办

【视频】手把手教你抓美女~

【视频】有了selenium,小白也可以自豪的说:“去TMD的抓包、cookie”

【视频】快来get新技能--抓包+cookie,爬微博不再是梦

【视频教程】用python批量抓取简书用户信息

识别假货有绝招,就用python爬淘宝评论

用Python抓取百度地图里的店名,地址和联系方式

文本处理分析

gensim:用Word2Vec进行文本分析

RAKE:快速自动抽取关键词算法

对于中文,nltk能做哪些事情

用nltk计算词语间的点互信息值PMI

Python NLP中的五大英雄

用SenticNet库做细粒度情感分析

如何对csv文件中的文本数据进行分析处理

复杂网络分析数据准备篇

文本分析之网络关系

用词云图解读“于欢案”

基于共现发现人物关系的python实现

用pyecharts制作词云图

图片数据处理

OpenCV:快速入门图片人脸识别

好玩的OpenCV:图片操作的基本知识(1)

好玩的OpenCV:图像操作的基本知识(2)

OpenCV:计算图片有多色

如何对数据进行各种排序?

其他

迅雷不给力,我DIY了个下载器

【视频】初学者必看:python环境配置

开扒皮自己微信的秘密

初识装饰器函数

计算运行时间-装饰器实现

花十分钟,给爱机安装个MongoDB

chardet库:轻松识别文件的编码格式

使用Python登录QQ邮箱发送QQ邮件

WTF Python: 开启你的懵逼模式

8行代码实现微信聊天机器人

WTF Python: 开启你的懵逼模式

WTF Python:开启懵逼模式第二弹

使用Python+OpenCV进行面部合成

十分钟学会用Flask发邮件




    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存