社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

不服不行,Python 操作 JSON 的门道也这么多~

Python编程时光 • 3 年前 • 365 次点击  

点击上方“Python编程时光”,选择“加为星标

第一时间关注Python技术干货!

作者:Peter
来源:Python编程时光


在实际工作中,尤其是web数据的传输,我们经常会遇到json数据。它不像常见的文本数据、数值数据那样友好,而且它和Python中的字典类型数据又很相像,给很多人造成了困扰。

本文结合具体案例详细介绍了如何利用Python和pandas(Python的第三方库)来处理json数据,主要内容包含:

  • json数据简介

  • 常用json数据转化网站

  • json数据和Python数据的转化

  • pandas处理json数据


1. JSON 简单介绍

1.1 什么是json数据

首先,我们看一段来自维基百科对json的解释:

JSONJavaScript Object Notation,JavaScript对象表示法)是一种由道格拉斯·克罗克福特构想和设计、轻量级的资料交换语言,该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。

JSON 数据格式与语言无关。即便它源自JavaScript,但目前很多编程语言都支持 JSON 格式数据的生成和解析。文件扩展名是 .json

通过上面的官方介绍,我们总结3点:

  • JSON是一种文本(资料)语言,超轻量级的数据交换格式

  • JSON数据容易阅读,易读性强

  • 源自JavaScript,其他语言可解析JSON数据

1.2 json数据类型

JSON实际上是JavaScript的一个子集,JSON语言中仅有的6种数据类型或者它们之间的任意组合:

  • number:和JavaScript中的number一致

  • boolean:JavaScript中的true或者false

  • string:JavaScript中的string

  • null:JavaScript中的null

  • array:JavaScript的表示方式:[]

  • object:JavaScript的{…}表示方式

1.3 两点规定

1、JSON语言中规定了字符集必须是UTF-8

2、为了统一解析,JSON的字符串规定必须是双引号""

2. 常用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格式是否正确的一个在线应用工具

3. JSON 和 Dict 类型转化

本小节主要讲解的json类型数据和Python类型的转化。

json对象和Python字典的转化主要使用的是内置json包,下面详细介绍该包的使用。详细的学习资料见官网:https://docs.python.org/3/library/json.html

首先使用的时候直接导入该包:

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
dictobject
list, tuplearray
str, unicodestring
int, long, floatnumber
Truetrue
Falsefalse
Nonenull

json.dumps方法的作用是将Python字典类型的数据转成json格式的数据,具体的参数如下:

json.dumps(obj,   # 待转化的对象
           skipkeys=False,  # 默认值是False,若dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key
           ensure_ascii=True,  # 默认是ASCII码,若设置成False,则可以输出中文
           check_circular=True,  # 若为False,跳过对容器类型的循环引用检查
           allow_nan=True,  # 若allow_nan为假,则ValueError将序列化超出范围的浮点值(nan、inf、-inf),严格遵守JSON规范,而不是使用JavaScript等价值(nan、Infinity、-Infinity)
           cls=None
           indent=None# 参数根据格式缩进显示,表示缩进几个空格
           separators=None,   # 指定分隔符;包含不同dict项之间的分隔符和key与value之间的分隔符;同时去掉`: `
           encoding="utf-8",  # 编码
           default=None# 默认是一个函数,应该返回可序列化的obj版本或者引发类型错误;默认值是只引发类型错误
           sort_keys=False,  # 若为False,则字典的键不排序;设置成True,按照字典排序(a到z) 
           **kw)

通过例子来解释上面几个常见参数的作用

1、当我们的Python类型数据中存在中文




    
information1 = {
    'name''小明',
    'age'18,
    'address''shenzhen'
}
# 字典转成json数据
information2 = json.dumps(information1)

print(type(information1))
print(type(information2))
print(information2)

加上ensure_ascii=False参数即可显示中文:

# 字典转成json数据
information3 = json.dumps(information1,ensure_ascii=False)

⚠️通过结果我们发现:json数据中全部变成了双引号,原来的字典类型数据中使用的是单引号,再看一个关于引号变化的例子:

>>> import json
>>> print(json.dumps({'4'5'6'7}, sort_keys=True, indent=4))  # python中的键是字符串,用单引号

# 结果显示
{
    "4"5,  # 变成双引号
    "6"7
}

2、对json数据通过缩进符美观输出,使用indent参数

information4 = {
    'name''小明',
    'age'18,
    'skills''python',
    'english''CET6',
    'major''会计',
    'address''深圳'
}

information5 = json.dumps(information4, ensure_ascii=False)   # 不缩进
information6 = json.dumps(information4, ensure_ascii=False, indent=2)  # 缩进2个空格  
information7 = json.dumps(information4, ensure_ascii=False, indent=5)  # 缩进5个空格


print(information5)
print(information6)
print(information7)

3、对Python数据类型中键进行排序输出

information4 = {
    'name''小明',
    'age'18,
    'skills''python',
    'english''CET6',
    'major''会计',
    'address''深圳'
}

information8 = json.dumps(information4, ensure_ascii=False, indent=2)  
information9 = json.dumps(information4, ensure_ascii=False, indent=2,sort_keys=True)  #  键的排序设置成True 

print(information8)
print(information9)

通过sort_keys=True的设置,可以观察到输出的结果进行了首写字母的排序;当首写字母相同,按照第二个字母再进行排序。

4、输出分隔符的控制

使用separators参数来设置不同的输出分隔符;不同的dic元素之间默认是,键值对之间默认是:

information1 = {
    'name''小明',
    'age'18,
    'address''shenzhen'
}

information2 = json.dumps(information1,ensure_ascii=False)
information10 = json.dumps(information1,ensure_ascii=False,separators=('+','@'))  # 改变分隔符

print(information2)  # 默认连接符
print(information10)  

json.dump

json.dump功能和json.dumps类似,只是需要将数据存入到文件中,二者参数相同

我们尝试将下面的个人信息写入到文件中

information = {
    'name''小明',
    'age'18,
    'skills''python',
    'english''CET6',
    'major''会计',
    'address''深圳'
}

1、如果不使用indent参数,全部信息显示为一行

# 使用json.dump;json数据一定是双引号

with open("information_1_to_json.json""w", encoding='utf-8'as f:
    # json.dump(dic_, f) # 全部写入一行数据,不换行
    json.dump(information,   # 待写入数据
              f, # File对象
              sort_keys=True,  # 键的排序
              ensure_ascii=False)  # 显示中文

看看实际的保存效果:

加入indent参数,会显示成多行数据:

with open("information_2_to_json.json""w", encoding='utf-8'as f:
    json.dump(information, 
              f, 
              indent=2,  # 空格缩进符,写入多行
              sort_keys=True
              ensure_ascii=False

json.loads

load相关的两个函数是将json转成Python数据类型,转化对照表如下:

JSONPython
objectdict
arraylist
stringunicode
number (int)int, long
number (real)float
trueTrue
falseFalse
nullNone

json.loads的作用是将json格式的数据转成Python字典类型的数据。

information1 = {
    'name''小明',
    'age'18,
    'address''shenzhen'
}
# 字典转成json数据
information3 = json.dumps(information1,ensure_ascii=False)

information11 = json.loads(information3)  # json转成字典数据
print(information11)

json.load

打开json文件再转成字典形式的数据

# 使用json.load

with open("information_to_json.json",encoding="utf-8"as f:
    json_to_dict = json.load(f)  # json转成字典

print(json_to_dict)

4. JSON 和 非 Dict 类型的转化

上面介绍的主要是json格式数据和Python字典之间的转化,下面讲解了Python其他数据类型通过json.dumps方法转成json个数据:

1、元组转化

2、列表转化

3、布尔值转化

4、数值型数据转化

5. 利用 Demjson 来解析

DemjsonPython的第三方库,能够用于编码和解码json数据:

  • encode:将 Python 对象编码成 JSON 字符串

  • decode:将已编码的 JSON 字符串解码为 Python 对象

安装demjson

直接使用pip install demjson安装,kan'dao看到如下界面表示安装成功。

使用demjson

使用之前先进行导入:




    
import demjson   # 导入包

1、编码功能

2、解码功能

demjson包一个明显的缺点就是不能直接解析中文数据:

如果我们想看到中文数据,可以使用eval函数:

6. 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

6.1 read_json

首先看看官网中read_json的参数:

pandas.read_json(
  path_or_buf=None,  # json文件路径
  orient=None,  # 重点参数,取值为:"split"、"records"、"index"、"columns"、"values"
  typ='frame',   # 要恢复的对象类型(系列或框架),默认’框架’.
  dtype=None# boolean或dict,默认为True
  convert_axes=None
  convert_dates=True
  keep_default_dates=True
  numpy=False
  precise_float=False
  date_unit=None
  encoding=None
  lines=False,  # 布尔值,默认为False,每行读取该文件作为json对象
  chunksize=None,
  compression='infer'
  nrows=None
  storage_options=None)

详细的参数解析可以参考文章:https://blog.csdn.net/qq_41562377/article/details/90203805

假设我们现在有一份json数据,如下图所示:

我们将上面的数据读取进来,由于数据是比较规范的,所以直接填写文件路径即可读取:

重点讲解下参数orient

1、oriden='split'

split’ : dict like {index -> [index], columns -> [columns], data -> [values]}

json文件的key的名字只能为index,cloumns,data这三个,另外多一个key都不行,少一个也不行。举例说明:

2、orient='records'

‘records’ : list like [{column -> value}, … , {column -> value}]

3、orient='index'

dict like {index -> {column -> value}}

4、orient='columns'

dict like {column -> {index -> value}}

转置之后就是上面orient='index'的结果



5、orient='values'

‘values’ : just the values array

6.2 to_json

to_json方法就是将DataFrame文件保存成json文件:




    
df.to_json("个人信息.json")   # 直接保存成json文件

如果按照上面的代码保存,中文是没有显示的:

当然我们可以通过json.load将json文件再次读取进行,显示中文,我们也可以直接在保存的时候显示中文:

df.to_json("个人信息1.json",force_ascii=False)   # 显示中文

6.3 json_normalize

https://www.jianshu.com/p/a84772b994a0

上面介绍的json数据的保存和读取中json数据都是列表形式的;但是json文件中的数据通常不一定全部是列表形式,那么我们需要将字典结构的文件转成列表形式,这个过程就叫做规范化。

pandas中的json_normalize()函数能够将字典或列表转成表格,使用之前先进行导入:

from pandas.io.json import json_normalize

通过官网和一个实际的例子来同时进行学习,首先看看官网的例子:

1、层级字典通过属性的形式显示数据:

2、如果加入max_level参数则会显示不同的效果:

若max_level=0,则嵌套的字典会当做整体,显示在数据框中

若max_level=1,则嵌套的字典会被拆解,里面的键会被单独出来:

3、读取层级嵌套中的部分内容:

4、读取全部内容

7. 总结一下

json数据是工作中经常会遇到的一种数据格式,也是很重要的一种数据。

本文首先对json数据及格式进行了简介,重新认识json 数据;其次,结合各种实际案例,将jsonPython的各种数据类型,尤其是字典类型进行了转化;最后,重要讲解了json数据的读取、写入和规范化的操作。

希望这篇文章的详细讲解,能够帮助到各位搞定json数据~




推荐阅读  点击标题可跳转
牛逼至极!用这个神器看代码太舒服了
情人节表白神器,v2.0 版本
边玩边学,4个 Python 的编程游戏网站
围观大神是如何用 Python 处理文件的?
一个中科大差生的 8年 程序员工作总结
如果对你有帮助。
请不吝点赞,点在看。谢谢。
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/108450
 
365 次点击