Python中JSON的基本使用
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它主要提供了四个方法: dumps
、dump
、loads
、load
。
dump和dumps
dump
和dumps
对python
对象进行序列化。将一个Python
对象进行JSON
格式的编码。
dump函数:
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
- 1
obj
: 表示是要序列化的对象。
fp
: 文件描述符,将序列化的str保存到文件中。json模块总是生成str对象,而不是字节对象;因此,fp.write()必须支持str输入。
skipkeys
: 默认为False
,如果skipkeysTrue
,(默认值:False),则将跳过不是基本类型(str,int,float,bool,None)的dict键,不会引发TypeError
。
ensure_ascii
: 默认值为True
,能将所有传入的非ASCII字符转义输出。如果ensure_ascii
为False
,则这些字符将按原样输出。
check_circular
:默认值为True
,如果check_circular
为False
,则将跳过对容器类型的循环引用检查,循环引用将导致OverflowError
。
allow_nan
: 默认值为True
,如果allow_nan
为False
,则严格遵守JSON规范,序列化超出范围的浮点值(nan,inf,-inf)会引发ValueError
。 如果allow_nan
为True
,则将使用它们的JavaScript
等效项(NaN,Infinity,-Infinity)。
indent
: 设置缩进格式,默认值为None
,选择的是最紧凑的表示。如果indent
是非负整数或字符串,那么JSON数组元素和对象成员将使用该缩进级别进行输入;indent
为0,负数或“”仅插入换行符;indent
使用正整数缩进多个空格;如果indent
是一个字符串(例如“\t”),则该字符串用于缩进每个级别。
separators
: 去除分隔符后面的空格,默认值为None
,如果指定,则分隔符应为(item_separator,key_separator)元组。如果缩进为None
,则默认为(’,’,’:’);要获得最紧凑的JSON表示,可以指定(’,’,’:’)以消除空格。
default
: 默认值为None
,如果指定,则default
应该是为无法以其他方式序列化的对象调用的函数。它应返回对象的JSON可编码版本或引发TypeError
。如果未指定,则引发TypeError
。
sort_keys
: 默认值为False
,如果sort_keys
为True
,则字典的输出将按键值排序。
dumps函数:
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
- 1
dumps
函数不需要传文件描述符,其他的参数和dump
函数的一样。
load和loads
load
和loads
反序列化方法,将json
格式数据解码为python
对象。
load函数:
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- 1
fp
: 文件描述符,将fp(.read()支持包含JSON文档的文本文件或二进制文件)反序列化为Python对象。
object_hook
: 默认值为None
,object_hook
是一个可选函数,此功能可用于实现自定义解码器。指定一个函数,该函数负责把反序列化后的基本类型对象转换成自定义类型的对象。
parse_float
: 默认值为None
,如果指定了parse_float
,用来对JSON
float字符串进行解码,这可用于为JSON
浮点数使用另一种数据类型或解析器。
parse_int
: 默认值为None
,如果指定了parse_int
,用来对JSON
int字符串进行解码,这可以用于为JSON整数使用另一种数据类型或解析器。
parse_constant
:默认值为None
,如果指定了parse_constant
,对-Infinity
,Infinity
,NaN
字符串进行调用。如果遇到了无效的JSON
符号,会引发异常。
如果进行反序列化(解码)的数据不是一个有效的JSON
文档,将会引发 JSONDecodeError
异常。
loads函数:
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- 1
s
: 将s(包含JSON文档的str,bytes或bytearray实例)反序列化为Python对象。
encoding
: 指定一个编码的格式。
loads
也不需要文件描述符,其他参数的含义和load
函数的一致。
格式转化表
JSON
中的数据格式和Python
中的数据格式转化关系如下:
JSON | Python |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
实例:
dump和dumps
import json# dumps可以格式化所有的基本数据类型为字符串
data1 = json.dumps([]) # 列表
print(data1, type(data1))
data2 = json.dumps(2) # 数字
print(data2, type(data2))
data3 = json.dumps('3') # 字符串
print(data3, type(data3))
dict = {"name": "Tom", "age": 23} # 字典
data4 = json.dumps(dict)
print(data4, type(data4))with open("test.json", "w", encoding='utf-8') as f:# indent 超级好用,格式化保存字典,默认为None,小于0为零个空格f.write(json.dumps(dict, indent=4))json.dump(dict, f, indent=4) # 传入文件描述符,和dumps一样的结果
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
得到的输出结果如下:格式化所有的数据类型为str
类型
[] <class 'str'>
2 <class 'str'>
"3" <class 'str'>
{"name": "Tom", "age": 23} <class 'str'>
- 1
- 2
- 3
- 4
test.json
中的内容
{"name": "Tom","age": 23
}
- 1
- 2
- 3
- 4
load和loads
import jsondict = '{"name": "Tom", "age": 23}' # 将字符串还原为dict
data1 = json.loads(dict)
print(data1, type(data1))with open("test.json", "r", encoding='utf-8') as f:data2 = json.loads(f.read()) # load的传入参数为字符串类型print(data2, type(data2))f.seek(0) # 将文件游标移动到文件开头位置data3 = json.load(f)print(data3, type(data3))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
运行结果如下:
{'name': 'Tom', 'age': 23} <class 'dict'>
{'name': 'Tom', 'age': 23} <class 'dict'>
{'name': 'Tom', 'age': 23} <class 'dict'>
- 1
- 2
- 3
常见的错误:
读取多行的JSON文件
假如要读取一个多行的JSON文件:
{"坂": ["坂5742"]}
{"构": ["构6784"]}
{"共": ["共5171"]}
{"钩": ["钩94a9"]}
{"肮": ["肮80ae"]}
{"孤": ["孤5b64"]}
- 1
- 2
- 3
- 4
- 5
- 6
如果直接使用:
with open(json_path, 'r') as f:json_data = json.load(f)
- 1
- 2
就会报错:抛出异常JSONDecodeError
。
json.decoder.JSONDecodeError: Extra data: line 2 column 1 (char 17)
- 1
表示数据错误,数据太多,第2行第一列
因为json
只能读取一个文档对象,有两个解决办法
1、单行读取文件,一次读取一行文件。
2、保存数据源的时候,格式写为一个对象。
单行读取文件:
with open(json_path, 'r') as f:for line in f.readlines():json_data = json.loads(line)
- 1
- 2
- 3
但是这种做法还有个问题,如果JSON文件中包含空行,还是会抛出JSONDecodeError
异常
json.decoder.JSONDecodeError: Expecting value: line 2 column 1 (char 1)
- 1
可以先处理空行,再进行文件读取操作:
for line in f.readlines():line = line.strip() # 使用strip函数去除空行if len(line) != 0:json_data = json.loads(line)
- 1
- 2
- 3
- 4
合并为一个对象
将json
文件处理成一个对象文件。
{"dict": [
{"坂": ["坂5742"]},
{"构": ["构6784"]},
{"共": ["共5171"]},
{"钩": ["钩94a9"]},
{"肮": ["肮80ae"]},
{"孤": ["孤5b64"]}
]}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
然后再用:
with open(json_path, 'r') as f:json_data = json.loads(f.read())
- 1
- 2
总结:
json.dumps
将 Python 对象编码成 JSON 字符串
json.loads
将已编码的 JSON 字符串解码为 Python 对象
json.dump
和json.load
,需要传入文件描述符,加上文件操作。
JSON
内部的格式要注意,一个好的格式能够方便读取,可以用indent
格式化。
参考链接:
https://docs.python.org/3.6/library/json.html#py-to-json-table
https://www.cnblogs.com/tjuyuan/p/6795860.html
http://liuzhijun.iteye.com/blog/1859857
https://blog.csdn.net/qq_22073849/article/details/78192289
http://www.runoob.com/python3/python3-json.html
Python中JSON的基本使用相关推荐
- python中json dumps_python中json.loads,dumps,jsonify使用
search_info = {'id':132,'user_role':3} print type(search_info) #输出 #转为string用dumps print type(json.d ...
- python中json的使用
python中json的使用 代码如下: import jsondict1 = {'A': 'a', 'B': 'b', 'C': 'c'} print(type(dict1)) print(dict ...
- python中JSON转XML文件
python中JSON转XML文件 # 接收前台给的json数据 jsonData = json.loads(request.POST.get("jsonData")); # 接收 ...
- Python中json模块的load/loads方法实战及参数详解
文章目录 前言 正文 1. loads方法与load方法的异同 1.1不相同点: 1.2 相同点 1.3 例子 2. 转换成Python对象 3. json.load(s)的参数 3.1 s参数 3. ...
- 【强烈推荐】Python中JSON的基本使用(超详细)
Python中JSON的基本使用 1. JSON简介 2. JSON语法规则 3. JSON数据类型 4. JSON对象 5. JSON数组 6. JSON中常用的方法 6.1 json.dumps( ...
- python中json与str转换和出现KeyError的解决方法
python中json与str转换和出现KeyError的解决方法 json转str str转json KeyError的解决方法 json转str json格式的数据其实就是dict类型的数据,如图 ...
- python中json模块_Python使用内置json模块解析json格式数据的方法
本文实例讲述了Python使用内置json模块解析json格式数据的方法.分享给大家供大家参考,具体如下: Python中解析json字符串非常简单,直接用内置的json模块就可以,不需要安装额外的模 ...
- python中json模块博客园_Python中的Json模块详解
Python中的Json模块详解 Json(JavaScript Object Notation)它是一种轻量级的数据交换格式,具有数据格式简单,读写方便易懂等很多优点.许多主流的编程语言都在用它来进 ...
- python中json.load()、json.loads()、json.dump()、json.dumps()的区别
json.load()从文件中读取json字符串 json.loads()将json字符串转换为字典类型 json.dumps()将python中的字典类型转换为字符串类型 json.dump()将j ...
- python中json模块博客园_python的json模块
python的json模块 什么是序列化和反序列化? 序列化 在分布式环境下,无论是何种数据,都会以二进制序列的形式在网络上传输.序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写 ...
最新文章
- QuestMobile 2017年中国移动互联网年度报告
- navicat导数据速度_华为廊坊云数据中心二期1~3期主楼聚氨脂、聚脲防水隔热总承包工程...
- 将一个datetime的now转换为只有日期的_不要眨眼!中英文、大小写转换,一秒就搞定!
- 使用linux 的wget下载国外的域名的地址,下载不了,
- IIS-301永久重定向
- JHChart 1.1.0 iOS图表工具库中文ReadMe
- 带你吃透分布式的精髓!
- “音”你而来,“视”而可见 腾讯云+社区音视频技术开发实战沙龙圆满结束...
- C10K、C10M问题
- 常用等价无穷小以及泰勒公式
- LoRa vs LTE-M vs Sigfox
- 学生家乡网页设计作品静态HTML网页—— HTML+CSS+JavaScript制作辽宁沈阳家乡主题网页源码(11页)
- mercury路由器重置后服务器无响应,MERCURY无线路由器重置后重新设置不能 – 手机爱问...
- NPOI实现Word插入段落
- 从T型人才理解ALM Polarion
- 四月电商战 京东突围与苏宁国美当当再围剿
- JavaSE基础答案合集class篇
- C语言复习内存 c2
- Python+Vue计算机毕业设计在线教育平台1ldd7(程序+LW+源码+部署)
- Ubuntu 安装 eyeOS