Python json模块与jsonpath模块区别详解


Posted in Python onMarch 05, 2020

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。

JSON和XML相比较可谓不相上下。

Python 3.X中自带了JSON模块,直接import json就可以使用了。

官方文档:http://docs.python.org/library/json.html

Json在线解析网站:http://www.json.cn/

JSON

json简单来说就是JavaScript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构。

对象:对象在js中表示为{ }括起来的内容,数据结构为{key1: value1, key2:value2, ...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是数字、字符串、数组、对象。

数组:数组在js中是[ ]括起来的内容,数据结构为['Python', ‘JavaScript', 'C++', ...],取值方式和所有语言一样,使用索引获取,字段值的类型可以是数字、字符串、数组、对象。

json模块

json模块提供了四个功能:dumps、dump、loads、load,用于字符串和Python数据类型间进行转换。

1.json.dumps()

实现Python类型转化为Json字符串,返回一个str对象,从Python到Json的类型转换对照如下:

Python Json
dict object
list, tuple array
str, utf-8 string
int, float number
True true
False false
None null 
#!/usr/bin/python3
# -*- coding:utf-8 -*-
__author__ = 'mayi'
 
import json
 
listStr = [1, 2, 3, 4]
tupleStr = (1, 2, 3, 4)
dictStr = {"city": "北京", "name": "蚂蚁"}
 
print(json.dumps(listStr))
# [1, 2, 3, 4]
 
print(type(json.dumps(listStr)))
# <class 'str'>
 
print(json.dumps(tupleStr))
# [1, 2, 3, 4]
 
print(type(json.dumps(tupleStr)))
# <class 'str'>
 
# 注意:json.dumps() 序列化时默认使用的ascii编码
# 添加参数 ensure_ascii=False 禁用ascii编码,按utf-8编码
print(json.dumps(dictStr, ensure_ascii = False))
# {"city": "北京", "name": "蚂蚁"}
 
print(type(json.dumps(dictStr, ensure_ascii = False)))
# <class 'str'>

2.json.dump()

将Python内置类型序列化为Json对象后写入文件

#!/usr/bin/python3
# -*- coding:utf-8 -*-
__author__ = 'mayi'
import json
listStr = [{"city": "北京"}, {"name": "蚂蚁"}]
json.dump(listStr, open("listStr.json", "w", encoding = "utf-8"), ensure_ascii = False)
 
dictStr = {"city": "北京", "name": "蚂蚁"}
json.dump(dictStr, open("dictStr.json", "w", encoding = "utf-8"), ensure_ascii = False)

3.json.loads()

把Json格式字符串解码转换成Python对象,从Json到Python的类型转换对照如下:

Json Python
object dict
array list
string utf-8
number(int) int
number(real) float
true True
false False
null None
#!/usr/bin/python3
# -*- coding:utf-8 -*-
__author__ = 'mayi'
 
import json
 
strList = '[1, 2, 3, 4]'
 
strDict = '{"city": "北京", "name": "蚂蚁"}'
 
print(json.loads(strList))
# [1, 2, 3, 4]
 
# json数据自动按utf-8存储
print(json.loads(strDict))
# {'city': '北京', 'name': '蚂蚁'}

4.json.load()

读取文件中Json形式的字符串,转换成Python类型

#!/usr/bin/python3
# -*- coding:utf-8 -*-
__author__ = 'mayi'
import json
strList = json.load(open("listStr.json", "r", encoding = "utf-8"))
print(strList)
# [{'city': '北京'}, {'name': '蚂蚁'}]
 
strDict = json.load(open("dictStr.json", "r", encoding = "utf-8"))
print(strDict)
# {'city': '北京', 'name': '蚂蚁'}

JsonPath

JsonPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:JavaScript、Python、PHP和Java。

JsonPath对于JSON来说,相当于XPATH对于XML。

下载地址:https://pypi.python.org/pypi/jsonpath

安装方法:下载后解压之后执行 python setup.py install

官方文档:http://goessner.net/articles/JsonPath

JsonPath与XPath语法对比:

JsonPath结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法。

Xpath JSONPath 描述
/ $ 根节点
. @ 现行节点
/ . or [] 取子节点
.. n/a 取父节点,Jsonpath未支持
// .. 不管位置,选择所有符合条件的节点
* * 匹配所有元素节点
@ n/a 根据属性访问,JsonPath不支持
[] [] 迭代器(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)
| [,] 支持迭代器中做多选
[] ?() 支持过滤操作
n/a () 支持表达式计算
() n/a 分组,JsonPath不支持

示例:

以拉勾网城市JSON文件:http://www.lagou.com/lbs/getAllCitySearchLabels.json 为例,获取所有的城市名称。

#!/usr/bin/python3
# -*- coding:utf-8 -*-
__author__ = 'mayi'
 
import urllib.request
import json
import jsonpath
 
# 拉勾网城市JSON文件
url = 'http://www.lagou.com/lbs/getAllCitySearchLabels.json'
# User-Agent头
header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'}
 
# url 连同 headers,一起构造Request请求,这个请求将附带 chrome 浏览器的User-Agent
request = urllib.request.Request(url, headers = header)
 
# 向服务器发送这个请求
response = urllib.request.urlopen(request)
 
# 获取页面内容:bytes
html = response.read()
 
# 转码:bytes转str
html = html.decode("utf-8")
 
# 把json格式字符串转换成python对象
obj = json.loads(html)
 
# 从根节点开始,匹配name节点
city_list = jsonpath.jsonpath(obj, '$..name')
 
# 打印获取的name节点
print(city_list)
# 打印其类型
print(type(city_list))
 
# 写入本地磁盘文件
with open("city.json", "w", encoding = "utf-8") as f:
  content = json.dumps(city_list, ensure_ascii = False)
  f.write(content)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之Python安装
Sep 12 Python
将Django框架和遗留的Web应用集成的方法
Jul 24 Python
Python操作Word批量生成文章的方法
Jul 28 Python
python爬取酷狗音乐排行榜
Feb 20 Python
Python-Seaborn热图绘制的实现方法
Jul 15 Python
Python函数参数类型及排序原理总结
Dec 19 Python
Python的赋值、深拷贝与浅拷贝的区别详解
Feb 12 Python
python如何进行矩阵运算
Jun 05 Python
基于Python实现视频的人脸融合功能
Jun 12 Python
Python常用数据分析模块原理解析
Jul 20 Python
pycharm实现猜数游戏
Dec 07 Python
Python OpenCV实现图形检测示例详解
Apr 08 Python
Python如何用filter函数筛选数据
Mar 05 #Python
Python API len函数操作过程解析
Mar 05 #Python
Python通过Tesseract库实现文字识别
Mar 05 #Python
Python爬虫实现模拟点击动态页面
Mar 05 #Python
python实现图片横向和纵向拼接
Mar 05 #Python
基于Python生成个性二维码过程详解
Mar 05 #Python
Python callable内置函数原理解析
Mar 05 #Python
You might like
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
php $_ENV为空的原因分析
2009/06/01 PHP
浅谈php://filter的妙用
2019/03/05 PHP
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2012/07/21 Javascript
Javascript Request获取请求参数如何实现
2012/11/28 Javascript
总结JavaScript设计模式编程中的享元模式使用
2016/05/21 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
2016/12/27 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
2018/05/09 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
2018/11/30 Javascript
node全局变量__dirname与__filename的区别
2019/01/14 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
Python中json格式数据的编码与解码方法详解
2016/07/01 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
python matlibplot绘制多条曲线图
2021/02/19 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
给Python学习者的文件读写指南(含基础与进阶)
2020/01/29 Python
解决python 虚拟环境删除包无法加载的问题
2020/07/13 Python
如何利用python进行时间序列分析
2020/08/04 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
2020/10/10 Python
python 牛顿法实现逻辑回归(Logistic Regression)
2020/10/15 Python
CSS3实现酷炫的3D旋转透视效果
2019/11/21 HTML / CSS
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
英国首屈一指的票务公司:See Tickets
2019/05/11 全球购物
四年的个人工作自我评价
2013/12/10 职场文书
2014年高考决心书
2014/03/11 职场文书
经典商业广告词
2014/03/13 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
2014年办公室工作总结范文
2014/11/12 职场文书
《将心比心》教学反思
2016/02/23 职场文书
医学会议开幕词
2016/03/03 职场文书