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)

参考文档

posted @ 2017-10-07 01:29  KeithTt  阅读(322)  评论(0编辑  收藏  举报