JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它主要提供了四个方法: dumpsdumploadsload

dump和dumps

dumpdumpspython对象进行序列化。将一个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_asciiFalse,则这些字符将按原样输出。

check_circular:默认值为True,如果check_circularFalse,则将跳过对容器类型的循环引用检查,循环引用将导致OverflowError

allow_nan: 默认值为True,如果allow_nanFalse,则严格遵守JSON规范,序列化超出范围的浮点值(nan,inf,-inf)会引发ValueError。 如果allow_nanTrue,则将使用它们的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_keysTrue,则字典的输出将按键值排序。

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

loadloads反序列化方法,将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.dumpjson.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的基本使用相关推荐

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

  2. python中json的使用

    python中json的使用 代码如下: import jsondict1 = {'A': 'a', 'B': 'b', 'C': 'c'} print(type(dict1)) print(dict ...

  3. python中JSON转XML文件

    python中JSON转XML文件 # 接收前台给的json数据 jsonData = json.loads(request.POST.get("jsonData")); # 接收 ...

  4. Python中json模块的load/loads方法实战及参数详解

    文章目录 前言 正文 1. loads方法与load方法的异同 1.1不相同点: 1.2 相同点 1.3 例子 2. 转换成Python对象 3. json.load(s)的参数 3.1 s参数 3. ...

  5. 【强烈推荐】Python中JSON的基本使用(超详细)

    Python中JSON的基本使用 1. JSON简介 2. JSON语法规则 3. JSON数据类型 4. JSON对象 5. JSON数组 6. JSON中常用的方法 6.1 json.dumps( ...

  6. python中json与str转换和出现KeyError的解决方法

    python中json与str转换和出现KeyError的解决方法 json转str str转json KeyError的解决方法 json转str json格式的数据其实就是dict类型的数据,如图 ...

  7. python中json模块_Python使用内置json模块解析json格式数据的方法

    本文实例讲述了Python使用内置json模块解析json格式数据的方法.分享给大家供大家参考,具体如下: Python中解析json字符串非常简单,直接用内置的json模块就可以,不需要安装额外的模 ...

  8. python中json模块博客园_Python中的Json模块详解

    Python中的Json模块详解 Json(JavaScript Object Notation)它是一种轻量级的数据交换格式,具有数据格式简单,读写方便易懂等很多优点.许多主流的编程语言都在用它来进 ...

  9. python中json.load()、json.loads()、json.dump()、json.dumps()的区别

    json.load()从文件中读取json字符串 json.loads()将json字符串转换为字典类型 json.dumps()将python中的字典类型转换为字符串类型 json.dump()将j ...

  10. python中json模块博客园_python的json模块

    python的json模块 什么是序列化和反序列化? 序列化 在分布式环境下,无论是何种数据,都会以二进制序列的形式在网络上传输.序列化是一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写 ...

最新文章

  1. QuestMobile 2017年中国移动互联网年度报告
  2. navicat导数据速度_华为廊坊云数据中心二期1~3期主楼聚氨脂、聚脲防水隔热总承包工程...
  3. 将一个datetime的now转换为只有日期的_不要眨眼!中英文、大小写转换,一秒就搞定!
  4. 使用linux 的wget下载国外的域名的地址,下载不了,
  5. IIS-301永久重定向
  6. JHChart 1.1.0 iOS图表工具库中文ReadMe
  7. 带你吃透分布式的精髓!
  8. “音”你而来,“视”而可见 腾讯云+社区音视频技术开发实战沙龙圆满结束...
  9. C10K、C10M问题
  10. 常用等价无穷小以及泰勒公式
  11. LoRa vs LTE-M vs Sigfox
  12. 学生家乡网页设计作品静态HTML网页—— HTML+CSS+JavaScript制作辽宁沈阳家乡主题网页源码(11页)
  13. mercury路由器重置后服务器无响应,MERCURY无线路由器重置后重新设置不能 – 手机爱问...
  14. NPOI实现Word插入段落
  15. 从T型人才理解ALM Polarion
  16. 四月电商战 京东突围与苏宁国美当当再围剿
  17. JavaSE基础答案合集class篇
  18. C语言复习内存 c2
  19. Python+Vue计算机毕业设计在线教育平台1ldd7(程序+LW+源码+部署)
  20. Ubuntu 安装 eyeOS

热门文章

  1. C#操作项目配置文件
  2. python 数据结构-字典
  3. 通过Log4net来配置我们需要的日志文件格式
  4. 老生常谈:装饰者模式
  5. 制作WEB在线编辑器-插入HTML标签
  6. 利用自定义分页技术提高数据库性能
  7. App设计灵感之十二组精美的智能家居操作App设计案例
  8. iOS经典面试题之“runtime是如何实现weak变量的自动置nil”
  9. 【数据结构与算法】之树的概念与使用
  10. 4. Median of Two Sorted Arrays