前言
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换语言
JSON是独立于语言的文本格式, JSON 数据格式与语言无关
- JSON 数据格式的特点:
- 对象表示为键值对
- 数据由逗号分隔
- 花括号保存对象
- 对象一个对象包含一系列非排序的名称/值对,一个对象以{开始,并以}结束。每个名称/值对之间使用:分割
- 方括号保存数组,
- 数组一个数组是一个值的集合,一个数组以[开始,并以]结束。数组成员之间使用,分割
JSON 数据的读取
首先, 我们需要导入模块
import json
读取json数据, json模块提供了两个方法loads、load,都是实现“反序列化”, 那么,两者有和区别呢,对比如下:
def load(fp, *, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
"""Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
a JSON document) to a Python object."""
def loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
"""Deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance
containing a JSON document) to a Python object."""
由此不难看出, load需要传入一个文件对象, 而loads需要的是一个内存对象
现在有一文件data.json 数据内容如下:
{
"id": "2016984",
"title": "标题2",
"publish_data": "2019/4/15",
"publish_place": "广州",
"software": "boss",
"skill": ["Go", "Ruby", "Java", "Python"]
}
现在就分别使用load和loads读取data.json里面的内容并打印出来
with open('datas.json', 'r', encoding='utf-8') as fo:
d= json.load(fo)
print(d, type(d))
print('-'*150) # 分割一下好区分
with open('datas.json', 'r', encoding='utf-8') as fo:
'''
因为loads需要传入的是一个内存对象,所以
要先暂时保存到内存中, 再使用loads进行
数据的读取操作
'''
data = fo.read()
d2= json.loads(data)
print(d2, type(d2))
打印效果如下:
JSON 数据的写入
json模块同时也提供了两个写入的方法dump和dumps, 如下:
def 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):
"""Serialize ``obj`` as a JSON formatted stream to ``fp`` (a
``.write()``-supporting file-like object)."""
def 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):
"""Serialize ``obj`` to a JSON formatted ``str``."""
其实两个和读取大同小异, 都是需要的对象不一样.
那么, 这里有一个数据:
data = {
'id': '2016982',
'title': '标题1',
'publish_data': '2019/4/15',
'publish_place': '深圳',
'software': 'lg',
}
分别用dump和dumps来进行文件的写入
with open('datas.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4, separators=(', ', ': '))
with open('datas.json', 'w', encoding='utf-8') as f:
# 将字典格式化为字符串对象
f.write(json.dumps(data2, ensure_ascii=False, indent=4, separators=(', ', ': ')))
写入完毕之后就会得到一个文件datas.json, 内容如下:
{
'id': '2016982',
'title': '标题1',
'publish_data': '2019/4/15',
'publish_place': '深圳',
'software': 'lg',
}
方法中每个参数的作用
参数 | 作用 |
---|---|
skipkeys | 如果 skipkeys 是 true (默认为 False),那么那些不是基本对象(包括 str, int、float、bool、None)的字典的键会被跳过;否则引发一个 TypeError。 |
ensure_ascii | 如果 ensure_ascii 是 true (即默认值),输出保证将所有输入的非 ASCII 字符转义。如果 ensure_ascii 是 false,这些字符会原样输出。 |
check_circular | 如果 check_circular 是为假值 (默认为 True),那么容器类型的循环引用检验会被跳过并且循环引用会引发一个 OverflowError (或者更糟的情况)。 |
allow_nan | 如果 allow_nan 是 false(默认为 True),那么在对严格 JSON 规格范围外的 float 类型值(nan、inf 和 -inf)进行序列化时会引发一个 ValueError。如果 allow_nan 是 true,则使用它们的 JavaScript 等价形式(NaN、Infinity 和 -Infinity)。 |
indent | 如果 indent 是一个非负整数或者字符串,那么 JSON 数组元素和对象成员会被美化输出为该值指定的缩进等级。如果缩进等级为零、负数或者 "",则只会添加换行符。None(默认值)选择最紧凑的表达。使用一个正整数会让每一层缩进同样数量的空格。如果 *indent* 是一个字符串(比如 "\t"),那个字符串会被用于缩进每一层。 |
separators | 当指定时,separators 应当是一个 (item_separator, key_separator) 元组。当 indent 为 None 时,默认值取 (', ', ': '),否则取 (',', ': ')。为了得到最紧凑的 JSON 表达式,你应该指定其为 (',', ' |