一文搞定Python处理json数据
在实际工作中,尤其是web数据的传输,我们经常会遇到json数据。它不像常见的文本数据、数值数据那样友好,而且它和Python中的字典类型数据又很相像,给很多人造成了困扰。
本文结合具体案例详细介绍了如何利用Python和pandas(Python的第三方库)来处理json数据,主要内容包含:
- json数据简介
- 常用json数据转化网站
- json数据和Python数据的转化
- pandas处理json数据
json数据简介
什么是json数据
首先,我们看一段来自维基百科对json的解释:
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种由道格拉斯·克罗克福特构想和设计、轻量级的资料交换语言,该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。
JSON 数据格式与语言无关。即便它源自JavaScript,但目前很多编程语言都支持 JSON 格式数据的生成和解析。文件扩展名是
.json
。
通过上面的官方介绍,我们总结3点:
- JSON是一种文本(资料)语言,超轻量级的数据交换格式
- JSON数据容易阅读,易读性强
- 源自JavaScript,其他语言可解析JSON数据
json数据类型
JSON实际上是JavaScript的一个子集,JSON语言中仅有的6种数据类型或者它们之间的任意组合:
- number:和JavaScript中的number一致
- boolean:JavaScript中的true或者false
- string:JavaScript中的string
- null:JavaScript中的null
- array:JavaScript的表示方式:[]
- object:JavaScript的
{...}
表示方式
两点规定
1、JSON语言中规定了字符集必须是UTF-8
2、为了统一解析,JSON的字符串规定必须是双引号""
常用json数据转化网站
1、json.cn:https://www.json.cn/
2、json菜鸟工具:https://c.runoob.com/front-end/53
3、sojson:https://www.sojson.com/,非常全的json处理网站
4、kjson:https://www.kjson.com/
5、编程狮-json检验工具:https://www.w3cschool.cn/tools/index?name=jsoncheck
6、JSONViewer:http://jsonviewer.stack.hu/,用于检测Json格式是否正确的一个在线应用工具
json数据和Python类型的转化
json包
本小节主要讲解的json类型数据和Python类型的转化。
json
对象和Python
字典的转化主要使用的是内置json
包,下面详细介绍该包的使用。详细的学习资料见官网:https://docs.python.org/3/library/json.html
首先使用的时候直接导入该包:
1 | import json |
json
包中存在4中方法用来进行和Python内置数据类型的转化:
方法 | 作用 |
---|---|
json.dumps() | 将python对象编码成Json字符串:字典到json |
json.loads() | 将Json字符串解码成python对象:json到字典 |
json.dump() | 将python中的对象转化成json储存到文件中 |
json.load() | 将文件中的json的格式转化成python对象提取出来 |
笔记:两个和load相关的方法只是多了一步和文件相关的操作。
json.dumps
和dump相关的两个函数是将Python数据类型转成json类型,转化对照表如下:
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
json.dumps
方法的作用是将Python字典类型的数据转成json格式的数据,具体的参数如下:
1 | json.dumps(obj, # 待转化的对象 |
通过例子来解释上面几个常见参数的作用
1、当我们的Python类型数据中存在中文
1 | information1 = { |
加上ensure_ascii=False
参数即可显示中文:
1 | # 字典转成json数据 |
⚠️通过结果我们发现:json数据中全部变成了双引号,原来的字典类型数据中使用的是单引号,再看一个关于引号变化的例子:
1 | import json |
2、对json数据通过缩进符美观输出,使用indent参数
1 | information4 = { |
3、对Python数据类型中键进行排序输出
1 | information4 = { |
通过sort_keys=True
的设置,可以观察到输出的结果进行了首写字母的排序;当首写字母相同,按照第二个字母再进行排序。
4、输出分隔符的控制
使用separators
参数来设置不同的输出分隔符;不同的dic元素之间默认是,
,键值对之间默认是:
1 | information1 = { |
json.dump
json.dump
功能和json.dumps
类似,只是需要将数据存入到文件中,二者参数相同
我们尝试将下面的个人信息写入到文件中
1 | information = { |
1、如果不使用indent
参数,全部信息显示为一行
1 | # 使用json.dump;json数据一定是双引号 |
看看实际的保存效果:
加入indent
参数,会显示成多行数据:
1 | with open("information_2_to_json.json", "w", encoding='utf-8') as f: |
json.loads
和load
相关的两个函数是将json转成Python数据类型,转化对照表如下:
JSON | Python |
---|---|
object | dict |
array | list |
string | unicode |
number (int) | int, long |
number (real) | float |
true | True |
false | False |
null | None |
json.loads
的作用是将json格式的数据转成Python字典类型的数据。
1 | information1 = { |
json.load
打开json文件再转成字典形式的数据
1 | # 使用json.load |
python其他类型数据转成json数据
上面介绍的主要是json格式数据和Python字典之间的转化,下面讲解了Python其他数据类型通过json.dumps
方法转成json个数据:
1、元组转化
2、列表转化
3、布尔值转化
4、数值型数据转化
Demjson
Demjson
是Python
的第三方库,能够用于编码和解码json
数据:
- encode:将 Python 对象编码成 JSON 字符串
- decode:将已编码的 JSON 字符串解码为 Python 对象
安装demjson
直接使用pip install demjson
安装,看到如下界面表示安装成功。
使用demjson
使用之前先进行导入:
1 | import demjson # 导入包 |
1、编码功能
2、解码功能
demjson
包一个明显的缺点就是不能直接解析中文数据:
如果我们想看到中文数据,可以使用eval函数:
pandas处理json数据
下面介绍pandas库对json数据的处理:
- read_json:从json文件中读取数据
- to_json:将pandas中的数据写入到json文件中
- json_normalize:对json数据进行规范化处理
https://geek-docs.com/pandas/pandas-read-write/pandas-reading-and-writing-json.html
read_json
首先看看官网中read_json
的参数:
1 | pandas.read_json( |
详细的参数解析可以参考文章:https://blog.csdn.net/qq_41562377/article/details/90203805
假设我们现在有一份json数据,如下图所示:
我们将上面的数据读取进来,由于数据是比较规范的,所以直接填写文件路径即可读取:
重点讲解下参数orient
:
1、oriden=‘split’
1 | split’ : dict like {index -> [index], columns -> [columns], data -> [values]} |
json文件的key的名字只能为index,cloumns,data
这三个,另外多一个key都不行,少一个也不行。举例说明:
2、orient=‘records’
1 | ‘records’ : list like [{column -> value}, … , {column -> value}] |
3、orient=‘index’
1 | dict like {index -> {column -> value}} |
4、orient=‘columns’
1 | dict like {column -> {index -> value}} |
转置之后就是上面orient='index'
的结果
5、orient=‘values’
1 | ‘values’ : just the values array |
to_json
to_json
方法就是将DataFrame文件保存成json文件:
1 | df.to_json("个人信息.json") # 直接保存成json文件 |
如果按照上面的代码保存,中文是没有显示的:
当然我们可以通过json.load
将json文件再次读取进行,显示中文,我们也可以直接在保存的时候显示中文:
1 | df.to_json("个人信息1.json",force_ascii=False) # 显示中文 |
json_normalize
https://www.jianshu.com/p/a84772b994a0
上面介绍的json数据的保存和读取中json数据都是列表形式的;但是json文件中的数据通常不一定全部是列表形式,那么我们需要将字典结构的文件转成列表形式,这个过程就叫做规范化。
pandas中的json_normalize()
函数能够将字典或列表转成表格,使用之前先进行导入:
1 | from pandas.io.json import json_normalize |
通过官网和一个实际的例子来同时进行学习,首先看看官网的例子:
1、层级字典通过属性的形式显示数据:
2、如果加入max_level参数则会显示不同的效果:
若max_level=0,则嵌套的字典会当做整体,显示在数据框中
若max_level=1,则嵌套的字典会被拆解,里面的键会被单独出来:
3、读取层级嵌套中的部分内容:
4、读取全部内容
总结
json
数据是工作中经常会遇到的一种数据格式,也是很重要的一种数据。
本文首先对json
数据及格式进行了简介,重新认识json
数据;其次,结合各种实际案例,将json
和Python
的各种数据类型,尤其是字典类型进行了转化;最后,重要讲解了json
数据的读取、写入和规范化的操作
需要读者重点掌握5个包或者库或者方法:
1 | import json # 数据类型转化 |
希望通过文章的讲解能够帮助读者搞定json
数据😃