JSON模块
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。
- 基于ECMAScript(w3c制定的js规范)的一种实现,采用完全独立于编程语言的文本格式来存储和表示数据
- json跟javascript没有必然关系
- json有自己的数据类型,虽然跟JS的数据类型非常类似
- json是REST服务的标准格式
JSON模块属于Python的标准库,在安装python时会被默认安装,使用时直接import即可,无需单独安装。
import json
dir(json)
# ['JSONDecodeError', 'JSONDecoder', 'JSONEncoder', '__all__', '__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_default_decoder', '_default_encoder', 'codecs', 'decoder', 'detect_encoding', 'dump', 'dumps', 'encoder', 'load', 'loads', 'scanner']
JSON模块包括两个常用的内置函数:
- json.dumps():对数据进行编码,序列化。将python对象编码为json字符串。
- json.loads():对数据进行解码,反序列化。将json字符串解码为python对象。
在json的编解码过程中,python的原始类型与json类型会相互转换。
Python 编码为 JSON 类型转换对应表:
JSON 解码为 Python 类型转换对应表:
>>> help(json.dumps)
Help on function dumps in module 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)
Serialize ``obj`` to a JSON formatted ``str``.
>>> help(json.loads)
Help on function loads in module json:
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.
If the data being deserialized is not a valid JSON document, a JSONDecodeError will be raised.
import json
users=[{'name':'keith','age':18,'tel':110}, {'name':'jerry','age':36,'tel':112}]
j=json.dumps(users)
print(j)
# '[{"name": "keith", "age": 18, "tel": 110}, {"name": "jerry", "age": 36, "tel": 112}]'
users2=json.loads(j)
print(users2)
# [{'name': 'keith', 'age': 18, 'tel': 110}, {'name': 'jerry', 'age': 36, 'tel': 112}]
默认的格式并不美观,常见的JSON文档都是带缩进的,这里当然也可以,json.dumps()提供了可选参数。
import json
users=[{'name':'keith', 'age':18,'tel':110}, {'name':'jerry', 'age':36,'tel':112}]
print(json.dumps(users, sort_keys=True, indent=4, separators=(',', ': ')))
[
{
"age": 18,
"name": "keith",
"tel": 110
},
{
"age": 36,
"name": "jerry",
"tel": 112
}
]
缩进是一个非负整数或字符串(such as "\t"),默认为 None。
分隔符是一个元祖, 包含两个元素,一个是item分隔符,一个是kv分隔符。默认为 (', ', ': ')。
sort_keys如果为true,则输出的字典会以key排序。默认为False。
编码解码文件流数据
如果你要处理的是文件而不是字符串,可以使用__json.dump()__和__json.load()__来编码和解码JSON数据。
>>> help(json.dump)
Help on function dump in module 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)
Serialize ``obj`` as a JSON formatted stream to ``fp`` (a ``.write()``-supporting file-like object).
>>> help(json.load)
Help on function load in module json:
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.
import json
users=[{'name':'keith', 'age':18,'tel':110}, {'name':'jerry', 'age':36,'tel':112}]
# 写入JSON数据
with open('data.json', 'w') as f:
json.dump(users, f)
# 读取数据
with open('data.json', 'r') as f:
data = json.load(f)
参考文档