1.什么是JSON

维基百科中的定义: JSONJavaScript Object Notation,JavaScript对象表示法)是一种由道格拉斯·克罗克福特构想和设计、轻量级的资料交换语言,该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。

一个数据示例:

{"firstName": "Micheal","lastName": "Jordan","hobbies": ["running", "golfing", "singing"],"age": 35,"children": [{"firstName": "Marcus","age": 14},{"firstName": "Jeffrey","age": 12}]
}

JSON 支持原始类型,如数字, 字符串,以及嵌套列表和对象。

JSON 的编码过程通常称为序列化。该术语是指将数据对象转换为一系列字节以通过网络存储或传输

2. Python中的json

2.1 序列化 json.dump 和 json.dumps

  • dump 将数据写入文件
  • dumps 将数据生成字符串,  dump+str

代码示例

In [1]: import jsonIn [2]: json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
Out[2]: '["foo", {"bar": ["baz", null, 1.0, 2]}]'

将数据dump到文件

In [3]: with open('data.json', 'w')  as f:...:     data = {'database': 'mongo'}...:     json.dump(data, f)

数据 {"database": "mongo"} 被写入到data.json文件中

2.2 反序列化 json.load 和 json.loads

  • load 将文件中的JSON数据载入为对象
  • loads 将序列化的json字符串, 载入为JSON对象

通过表格可以看到, 反序列化并不是对序列化表的完美逆向,  反序列化不能生成tuple类型的数据.

In [4]: data = ('amigo', 'branda', 'ariza')
In [5]: json.loads(json.dumps(data))
Out[5]: ['amigo', 'branda', 'ariza']

2.3 dumps的参数

dumps函数提供一些参数, 可以控制序列化过程中的行为.

参数 描述 默认值
skipkeys 是否跳过无法被JSON序列化的key(包括str, int, float, bool, None) False
sort_keys 是否对数据按照key进行排序 False
ensure_ascii 输出保证将所有输入的非 ASCII 字符转义 True
allow_nan 是否允许JSON规范外的float数据(nan, inf, -inf) True
default 是一个函数, 当某个value无法被序列化时, 对其调用该函数 None
indent 是一个正整数,  代表序列化后的缩进 None
separator 是一个格式为 (item_separator, key_separator) 的元组, 默认取值为 (', ', ': ') None
check_circular 是否检查循环引用 True

下面使用一些数据示例依次说明:

2.3.1 skipkeys

In [1]: import jsonIn [2]: def func():...:     print('fun')In [3]: data = {func: 'value', 'key': 'data'}In [4]: json.dumps(data)
---------------------------------------------------------------------------
TypeError: keys must be str, int, float, bool or None, not functionIn [5]: json.dumps(data, skipkeys=True)
Out[5]: '{"key": "data"}'

字典数据 data 中的其中一个key是个函数func, 无法直接被JSON序列化, 所以对其执行json.dumps时, 报TypeError, 将skipkeys置为True, 序列化时跳过键值func, 序列化成功.

2.3.2 sort_keys

In [6]: data = {'c': 3, 'b': 2, 'a': 1}In [7]: json.dumps(data)
Out[7]: '{"c": 3, "b": 2, "a": 1}'In [8]: json.dumps(data, sort_keys=True)
Out[8]: '{"a": 1, "b": 2, "c": 3}'

指定sort_keys=True之后, 序列化后的数据按照key值[a, b, c]进行排序

2.3.3 ensure_ascii

In [13]: data = {'first': '大牛', 'second': '二狗', 'third': '猫蛋'}In [14]: json.dumps(data)
Out[14]: '{"first": "\\u5927\\u725b", "second": "\\u4e8c\\u72d7", "third": "\\u732b\\u86cb"}'In [15]: json.dumps(data, ensure_ascii=False)
Out[15]: '{"first": "大牛", "second": "二狗", "third": "猫蛋"}'

dunps时, 指定了ensure_ascii=False使序列化后的数据不强制使用ascii吗转码, 输出即是中文

2.3.4 allow_nan

In [9]: data = {'float': 1.2, 'nan': float('nan'), 'inf': float('inf')}
In [10]: data
Out[10]: {'float': 1.2, 'nan': nan, 'inf': inf}In [11]: json.dumps(data)
Out[11]: '{"float": 1.2, "nan": NaN, "inf": Infinity}'In [12]: json.dumps(data, allow_nan=False)
ValueError: Out of range float values are not JSON compliant

指定allow_nan=False之后, 被序列化对象包含,超出范围的float数据, 报ValueError

2.3.5 default

In [1]: from datetime import datetime
In [2]: import jsonIn [3]: data = {'date': datetime.now()}
In [3]: json.dumps(data)
TypeError: Object of type datetime is not JSON serializableIn [4]: json.dumps(data, default=lambda x: x.strftime('%Y/%m/%d %H:%M'))
Out[4]: '{"date": "2021/08/13 11:03"}'

数据data中包含无法被序列化的对象, date字段为datetime.datetime格式的数据, 直接调用json.dumps报TypeError, 指定default函数之后, 对date的字段应用函数转换成字符串格式, 序列化成功.

2.3.6 indent

In [5]: data = {'lgd': {'players': ['ame', 'nothingtosay', 'faith_bian', 'xinQ', 'y`'], 'coach': 'xiao8'}, 'VG': {'players': ['poyoyo', 'ori', 'old_eleven', 'pyw', 'dy']}}In [6]: print(json.dumps(data))
{"lgd": {"players": ["ame", "nothingtosay", "faith_bian", "xinQ", "y`"], "coach": "xiao8"}, "VG": {"players": ["poyoyo", "ori", "old_eleven", "pyw", "dy"]}}In [7]: print(json.dumps(data, indent=4))
{"lgd": {"players": ["ame","nothingtosay","faith_bian","xinQ","y`"],"coach": "xiao8"},"VG": {"players": ["poyoyo","ori","old_eleven","pyw","dy"]}
}

dumps时, 设置indent=4, 数据增加换行符, 数据层级以4个空格为缩进.

2.3.7 separator

In [8]: data
Out[8]: {'key': 'value', 'border': 'lands'}In [9]: json.dumps(data)
Out[9]: '{"key": "value", "border": "lands"}'In [10]: json.dumps(data, separators=(',', ':'))
Out[10]: '{"key":"value","border":"lands"}'In [11]: json.dumps(data, separators=('&', '@'))
Out[11]: '{"key"@"value"&"border"@"lands"}'

默认数据分割符为 ', ' 和 ': ', 通过指定separators=(',', ':')去除空格后, 可以使序列化后的数据更加紧凑. 甚至可以自定义连接符来dump成自定义的数据样式.

2.3.8 check_circular

In [21]: data = {'key': 'value', 'border': 'lands'}
In [22]: data['data'] = data
In [23]: data
Out[23]: {'key': 'value', 'border': 'lands', 'data': {...}}In [24]: json.dumps(data)
---------------------------------------------------------------------------
ValueError: Circular reference detectedIn [25]: json.dumps(data, check_circular=False)
---------------------------------------------------------------------------
RecursionError: maximum recursion depth exceeded while encoding a JSON object

当data中存在对自己的递归引用时, json.dumps 会报ValueError, 指定指定check_circular=False后, 不进行循环引用检验.

总结:

本文总结了python内置模块json的常用方法 dump和load

序列化过程中的一些参数控制总结:

① 无法序列化的数据, key的跳过, value使用函数转换

② 数据的排序, 编码, 非法float数据

③ 缩进和分隔符

需要更高级的对JSON数据的处理方法,参见 :

处理JSON 数据的神器: JMESPath

Python 中的json模块dumps参数详解相关推荐

  1. python json loads_如何区别python中的json模块loads和load方法

    在python中的json模块,有一对方法load()和loads(),其中load()方法是从json文件读取json,而loads()方法是直接读取json,两者都是将字符串json转换字典对象. ...

  2. python中文编码-python中文编码与json中文输出问题详解

    前言 python2.x版本的字符编码有时让人很头疼,遇到问题,网上方法可以解决错误,但对原理还是一知半解,本文主要介绍 python 中字符串处理的原理,附带解决 json 文件输出时,显示中文而非 ...

  3. python中时间戳、字符串之间转换详解

    [转载]python中时间戳.字符串之间转换详解 (2013-04-30 17:36:07) 转载▼ 标签: 转载 原文地址:python中时间戳.字符串之间转换详解作者:doris0920 1)秒数 ...

  4. 站长在线Python精讲:在Python中函数的定义与创建详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中函数的定义与创建详解>.本文的主要内容有:函数的定义.函数的定义规则.函数的创建. 目录 1.函数的定义 2 ...

  5. python argv 详解_对python中的argv和argc使用详解

    主要问题 为什么argv中第一个,即index=0的内容就是文件名? python中argc是用什么实现的? 概念解释 argc:argument counter,命令行参数个数 argv:argum ...

  6. Python中的__name__和__main__含义详解

    背景 在写Python代码和看Python代码时,我们常常可以看到这样的代码: ? 1 2 3 4 5 def main():     ...... if __name__ == "__ma ...

  7. python中关于深拷贝和浅拷贝的详解

    python中关于深拷贝和浅拷贝的详解 概述 在python的语法中,有两种变量的拷贝方式 一种是深拷贝,一种是浅拷贝 我们先说深拷贝 语法 这里需要通过导入系统的copy模块中的deepcopy才可 ...

  8. python中zip的使用_浅谈Python中的zip()与*zip()函数详解

    前言 1.实验环境: Python 3.6: 2.示例代码地址:下载示例: 3.本文中元素是指列表.元组.字典等集合类数据类型中的下一级项目(可能是单个元素或嵌套列表). zip(*iterables ...

  9. python的raw_ input是什么意思-对python中raw_input()和input()的用法详解

    最近用到raw_input()和input()来实现即时输入,就顺便找了些资料来看,加上自己所用到的一些内容,整理如下: 1.raw_input() raw_input([prompt]) -> ...

最新文章

  1. PPPOE/PPPOA白皮书小结
  2. 【Git】Git 版本管理 ( 补充提交版本 git commit --amend | 版本库提取文件 git checkout -- filename | 删除文件 git rm )
  3. 多进程 fork()与vfork()
  4. H5——while循环,for循环
  5. int 和 Integer 的区别
  6. python绘制如下图形、小三角形边长20_python二级操作题与分析(7)
  7. ubuntu14.04 安装pidgin-lwqq
  8. java 处理时间的类_java 日期时间处理类
  9. Python+request+ smtplib 测试结果html报告邮件发送(上)《五》
  10. 第三:GitHub的使用(超详细)
  11. MATLAB矩阵运算
  12. 总结:form中使用onSubmit=return false防止表单自动提交,以及s...
  13. ClickHouce 常用字符串函数
  14. Power BI——柱形图
  15. AWS Key Management Service(KMS)
  16. python调整视频内容比例_moviepy音视频剪辑:与大小相关的视频变换函数crop、even_size、margin、resize介绍...
  17. Bursuite暴力破解实践
  18. IOT设备情况数据分析
  19. Python数据挖掘 数据预处理案例(以航空公司数据为例)
  20. Unity入门动画开发视频

热门文章

  1. C++ 进程间通信详解
  2. 深度学习英文缩写_机器学习、深度学习……人工智能那些名词你知道几个?
  3. 【2020 ACM Fellow 华人学者】 任奎 浙江大学
  4. 如何卸载mysql教程(完全卸载)
  5. 软件工程师资格认证,你合格吗?
  6. C#毕业设计——基于C#+asp.net+sqlserver的证券术语解释及翻译系统设计与实现(毕业论文+程序源码)——翻译系统
  7. 人工智能学习体系大纲
  8. 这就是那个著名的接雨水算法题详解
  9. 关于map与set的count的时间复杂度(个人观点,不正确请指出)
  10. matlab错误dparsfa,Dpabi安装出错,求助大大佬