网易首页 > 网易号 > 正文 申请入驻

如何用 Python 与 Pandas 高效处理 JSON 数据?

0
分享至

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

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

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

  •   json数据简介

  •   常用json数据转化网站

  •   json数据和Python数据的转化

  •   pandas处理json数据


1. JSON 简单介绍 1.1 什么是json数据

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

JSON(JavaScript 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 dict object list, tuple array str, unicode string int, long, float number True true False false None null

  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数据类型,转化对照表如下:

  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字典类型的数据。

  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、数值型数据转化

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

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

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

安装demjson

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

  使用之前先进行导入:

  import demjson # 导入包

  1、编码功能

  2、解码功能

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

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

  下面介绍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、读取全部内容

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

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

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

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
1270万毕业生挤破头:比失业更可怕的,是无人化抢光普通人的饭碗

1270万毕业生挤破头:比失业更可怕的,是无人化抢光普通人的饭碗

侃故事的阿庆
2026-07-18 11:17:01
亚马尔伤情公布

亚马尔伤情公布

齐鲁壹点
2026-07-18 22:32:48
2026第一批高考捡漏王!487分被985大学录取,551分拿下双一流!

2026第一批高考捡漏王!487分被985大学录取,551分拿下双一流!

户外阿毽
2026-07-18 13:03:34
黄秋生深夜卖惨告别香港!路是自己走死,网友:绝不挽留

黄秋生深夜卖惨告别香港!路是自己走死,网友:绝不挽留

阿废冷眼观察所
2026-07-17 08:02:38
败光两个小目标后,网友说冉莹颖面相都变了,太吓人了

败光两个小目标后,网友说冉莹颖面相都变了,太吓人了

娱乐故事
2026-07-16 16:57:40
香港名媛林恬儿疑婚变,老公删除恩爱合照,母亲谢玲玲点赞证实

香港名媛林恬儿疑婚变,老公删除恩爱合照,母亲谢玲玲点赞证实

娱乐圈圈圆
2026-07-18 17:15:46
大s在书中写:小s怂恿她怀孕期间尽情吃,小孩7岁才送去学校

大s在书中写:小s怂恿她怀孕期间尽情吃,小孩7岁才送去学校

小椰的奶奶
2026-07-18 17:54:09
广汽埃安就“部分搭载中创新航177Ah磷酸铁锂电池出现故障问题”致歉:该部分车型质保期延长至8年30万公里,维修超5天车主可获补贴

广汽埃安就“部分搭载中创新航177Ah磷酸铁锂电池出现故障问题”致歉:该部分车型质保期延长至8年30万公里,维修超5天车主可获补贴

中国能源网
2026-07-19 01:17:10
前国脚申思掌掴小球员,视频曝光:3天扇了二十余下!

前国脚申思掌掴小球员,视频曝光:3天扇了二十余下!

半岛晨报
2026-07-18 16:16:19
中国的领土这次可能真要扩大了

中国的领土这次可能真要扩大了

孝沛与世界
2026-07-17 15:32:25
亚马尔萌弟成西班牙世界杯吉祥物,19岁天才球星当哥又当爹!

亚马尔萌弟成西班牙世界杯吉祥物,19岁天才球星当哥又当爹!

ChicMyGeek
2026-07-18 19:09:03
危险信号释放:银行利率这次可能不是闹着玩的

危险信号释放:银行利率这次可能不是闹着玩的

爱看剧的阿峰
2026-07-18 13:28:37
真的来了!苹果正式宣布 iPhone 全系大涨价!

真的来了!苹果正式宣布 iPhone 全系大涨价!

XCiOS俱乐部
2026-07-18 08:43:02
高市早苗史诗级大胜!我们还能说日本政府≠人民吗?

高市早苗史诗级大胜!我们还能说日本政府≠人民吗?

随波荡漾的漂流瓶
2026-02-09 13:20:27
成龙凌晨沉痛发声!林凤娇决定太狠,吴绮莉如今开撕无非3个原因

成龙凌晨沉痛发声!林凤娇决定太狠,吴绮莉如今开撕无非3个原因

李橑在北漂
2026-07-18 16:03:30
生活中的这些暗示你懂多少?网友:警察一句话,让我免受牢狱之灾

生活中的这些暗示你懂多少?网友:警察一句话,让我免受牢狱之灾

夜深爱杂谈
2026-07-18 21:01:07
两名参与10.7的哈马斯改名当小贩仍被以色列定点清除

两名参与10.7的哈马斯改名当小贩仍被以色列定点清除

桂系007
2026-07-18 23:59:24
姆巴佩8年换5任女友,世界杯期间必换绝色新欢个个都是绝色佳人

姆巴佩8年换5任女友,世界杯期间必换绝色新欢个个都是绝色佳人

借你一生
2026-07-18 04:17:24
证监会主席应具备三大硬素质

证监会主席应具备三大硬素质

新浪财经
2026-07-19 00:31:32
82:0通过!日本议会罕见联手:阻止高市早苗改动无核三原则

82:0通过!日本议会罕见联手:阻止高市早苗改动无核三原则

黑翼天使
2026-07-19 04:09:57
2026-07-19 05:40:49
Python猫 incentive-icons
Python猫
人生苦短,我用Python。博客:https://pythoncat.top
737文章数 8120关注度
往期回顾 全部

科技要闻

WAIC2026看什么?这份"不迷路"攻略请收好

头条要闻

“黄总请你去包厢” “黄总”身份公布

头条要闻

“黄总请你去包厢” “黄总”身份公布

体育要闻

德尚是非典型法国人 14年执教留下丰厚遗产

娱乐要闻

大S给具俊晔留遗产是昏头?实际上她清醒得很

财经要闻

股民当街砍博主!韩国股市 终极大屠杀

汽车要闻

把中国超跑卖到英国,比亚迪正在被世界看见

态度原创

旅游
数码
房产
健康
公开课

旅游要闻

600多年文风不断,走出大批文人将士,这座古镇藏着腾冲真正的根

数码要闻

RTX 5060换芯不换性能!微星V1版用上5070核心:大芯片散热反而更好

房产要闻

突然出手!千亩城更+一线江景,世嘉亮出超级四代宅!

刮痧也会刮出脑梗?讲个真实案例

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版