相关文章推荐
有腹肌的大象  ·  《python》用psutil获取电脑CPU ...·  3 周前    · 
近视的口罩  ·  python中怎样删除字符串头尾的空格和换行 ...·  3 周前    · 
大气的木耳  ·  批量删除txt文件最后一列-python_t ...·  2 周前    · 
旅行中的荒野  ·  Python ...·  2 周前    · 
从容的碗  ·  txt文件如何设置每行为空行?_编程语言-C ...·  2 周前    · 
豪爽的啄木鸟  ·  qtableview中不可编辑的单元格 - ...·  1 年前    · 
心软的黑框眼镜  ·  营养·  1 年前    · 
体贴的麻辣香锅  ·  .NET 6 史上最全攻略 - ...·  2 年前    · 
聪明的领带  ·  蓝牙设备的容器 ID - Windows ...·  2 年前    · 
彷徨的小虾米  ·  美盈森集团股份有限公司·  2 年前    · 
Code  ›  利用Python搞定json数据<建议收藏>开发者社区
javascript 字符编码 python函数 python
https://cloud.tencent.com/developer/article/1794432
卖萌的勺子
2 年前
作者头像
皮大大
0 篇文章

利用Python搞定json数据<建议收藏>

原创
前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 机器学习/数据可视化 > 利用Python搞定json数据<建议收藏>

利用Python搞定json数据<建议收藏>

原创
作者头像
皮大大
修改 于 2021-03-01 14:27:18
1.3K 0
修改 于 2021-03-01 14:27:18
举报

一文搞定Python处理json数据

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

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

  • json数据简介
  • 常用json数据转化网站
  • json数据和Python数据的转化
  • pandas处理json数据

<!--MORE-->

json数据简介

什么是json数据

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

JSON ( J ava S cript O bject N otation,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

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

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, 
              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)

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 安装,kan'dao看到如下界面表示安装成功。

使用demjson

使用之前先进行导入:

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 的参数:

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', 
 
推荐文章
有腹肌的大象  ·  《python》用psutil获取电脑CPU内存等参数信息_python获取cpu温度
3 周前
近视的口罩  ·  python中怎样删除字符串头尾的空格和换行-百度经验
3 周前
大气的木耳  ·  批量删除txt文件最后一列-python_txt删除最后一列
2 周前
旅行中的荒野  ·  Python 如何解决最后一行最后一个输出有逗号问题_有问必答-CSDN问答
2 周前
从容的碗  ·  txt文件如何设置每行为空行?_编程语言-CSDN问答
2 周前
豪爽的啄木鸟  ·  qtableview中不可编辑的单元格 - 腾讯云开发者社区 - 腾讯云
1 年前
心软的黑框眼镜  ·  营养
1 年前
体贴的麻辣香锅  ·  .NET 6 史上最全攻略 - MicrosoftReactor - 博客园
2 年前
聪明的领带  ·  蓝牙设备的容器 ID - Windows drivers | Microsoft Learn
2 年前
彷徨的小虾米  ·  美盈森集团股份有限公司
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号