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中关于字符串对象的一些基础知识
Apr 08 Python
python实现的AES双向对称加密解密与用法分析
May 02 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
Feb 01 Python
Python简单基础小程序的实例代码
Apr 28 Python
对python特殊函数 __call__()的使用详解
Jul 02 Python
python实现爬取百度图片的方法示例
Jul 06 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 Python
Django Celery异步任务队列的实现
Jul 24 Python
pandas 对group进行聚合的例子
Dec 27 Python
如何通过Python3和ssl实现加密通信功能
May 09 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
Jun 08 Python
用Python的绘图库(matplotlib)绘制小波能量谱
Apr 17 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
PHP操作xml代码
2010/06/17 PHP
深入PHP中慎用双等于(==)的详解
2013/06/06 PHP
如何利用PHP执行.SQL文件
2013/07/05 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
php中类和对象:静态属性、静态方法
2017/04/09 PHP
又一个图片自动缩小的JS代码
2007/03/10 Javascript
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
javaScript中push函数用法实例分析
2015/06/08 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
2016/11/25 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
解读ES6中class关键字
2017/11/20 Javascript
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
2017/12/24 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
2019/01/27 Javascript
vue 修改 data 数据问题并实时显示操作
2020/09/07 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
vue实现简易计算器功能
2021/01/20 Vue.js
Python数据结构与算法(几种排序)小结
2019/06/22 Python
python实现高斯(Gauss)迭代法的例子
2019/11/20 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
python对文件的操作方法汇总
2020/02/28 Python
Python列表的深复制和浅复制示例详解
2021/02/12 Python
canvas如何实现多张图片编辑的图片编辑器
2020/03/10 HTML / CSS
印度尼西亚在线时尚购物网站:ZALORA印尼
2016/08/02 全球购物
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
俄罗斯最大的香水和化妆品网上商店:Randewoo
2020/11/05 全球购物
Linux的主要特性
2014/10/06 面试题
应届毕业生的个人自我鉴定
2013/10/24 职场文书
网吧收银员岗位职责
2013/12/14 职场文书
银行员工辞职信范文
2014/01/20 职场文书
小学体育教学反思
2014/01/31 职场文书
2014年情人节活动方案
2014/02/16 职场文书
社区活动总结范文
2015/05/07 职场文书