你一定听说过 JSON 吧。JSON 是当前最常用的数据传输格式之一,纯文本,容易使用,方便阅读,最重要的是在多个场合都被大量被使用。
Json (Javascript Object Notation) 是一种轻量级的数据交换格式,它基于 Javascript 的对象字面量。尽管它只是 Javascript 的一个子集,但它与语言无关。以现代编程语言编写的程序,都可以用它来彼此交换数据。它是一种文本格式,人和机器都可以阅读它。
—— 《Javascript 语言精粹》
既然以现代编程语言都可以用它来交换数据,强大的 python 当然也不例外。要更好的使用 JSON 一定要先了解下它的语法。
JSON 的值分为 6 种类型,分别是对象,数组,字符串,数字,布尔值 (true 和 false )和null。来看一个典型的 JSON 集合,体会下这些类型。
{
"obj": {
"name": "xxx",
"address": {
"country": "china",
"city": "TianJin"
}
},
"arr_simple": [1, 2, 3, 5],
"arr_complex": [
1,
"a",
{
"b": "yyy"
},
true,
null
],
"str": "I am a string",
"num": 888,
"booValue": false,
"nullValue": null
}
看上面代码, JSON 语法有什么特点呢?
像字符串,数字,布尔值,null 都比较简单,无需细数,接下来我们重点来看下对象和数组。
JSON 对象有哪些特点?
JSON 对象的结构是什么样子呢?
上面代码中的 obj 就是一个 JSON 对象,我们来观察下它。
为了能够处理 JSON 数据,许多语言都有对应的数据类型可以映射为 JSON 对象,那么 python 中是什么数据类型呢?
是 dict
JSON 数组有哪些特点?
上面代码中的 arr_simple
和arr_complex
都表示数组,它们有哪些特点呢?
python 也有能够映射为 JSON 对象的数据类型,是 list 和 tuple
什么是编码和解码?
说到 JSON 和 python 之间的转换,就会涉及到两个名词:编码 和 解码。
那么到底什么是编码和解码呢?
编码是信息从一种形式或格式转换为另一种形式的过程。解码,是编码的逆过程,亦即把编码过的信息恢复成原来样式。
——维基百科
编码的作用则是为了利于传输和存储,JSON 当然是非常适合的。因此,
刚开始接触 json 的操作,我主要有下面几个疑问:
下面就让我们一一来探索这些问题。
json 操作需要什么库?
使用 json 函数前需要先导入 json 库:
import json
json 库本身就是 python 内置的标准库,因此你不需要做任何安装的操作。只要声明了上面语句,就可直接使用。
python 编码为 JSON 的对照表
要完成这个功能,先要看下 python 数据结构编码为 json 的对照表。
有了这张表,我们就可以清楚的知道 python 对象将编码成的 json 格式。
json.dumps()
json.dumps() 方法的作用就是将 python 对象转换成 JSON 字符串,下面来看具体的函数声明:
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
参数看起来好多啊,不过不用担心,这么多参数,只有第一个参数是必填的。下面就来一一了解下这些参数的意义
来看一个例子
>>> import json
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'
>>> print(json.dumps("\"foo\bar"))
"\"foo\bar"
>>> print(json.dumps('\u1234'))
"\u1234"
>>> print(json.dumps('\\'))
"\\"
>>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))
{"a": 0, "b": 0, "c": 0}
json.dump()
json.dump() 函数的作用就是将 python 对象转换成 JSON 字符串,并将其通过 fp 文件流写入到文件中。来看下具体的函数声明:
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)
和前面的 dumps 函数进行比较,会发现两个函数的参数是非常相似的,而且它们的意义也都相同。来看下面的例子
>>> import json
>>> from io import StringIO
>>> io = StringIO()
>>> json.dump(['streaming API'], io)
>>> io.getvalue()
'["streaming API"]'
JSON 解码为 python 的对照表
要完成这个功能,也先要看下 json 解码为 python 对象的对照表
编码对照表和解码对照表并不是一一对应的,因此如果一个 python对象 先编码成 JSON,再转码回来后得到的对象可就不一定完全相等了。
json.loads()
这个方法的作用就是将参数 s 按照上面的对照表反序列化为一个 python 对象。参数 s 可以是 str ,byte 或者byteArray 格式, 但必须要包含 JSON 文本才可以)。
具体函数声明如下:
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
下面就来一一了解下一些常用参数的意义
来看下面的例子,其中最后一行就指定了 parse_float 。
'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> import json
>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
['foo', {'bar': ['baz', None, 1.0, 2]}]
>>> json.loads('"\\"foo\\bar"')
'"foo\x08ar'
>>> import decimal
>>> json.loads('1.1', parse_float=decimal.Decimal)
Decimal('1.1')
json.load()
先来看函数声明
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
作用是将 fp 文件流反序列化为 python 对象,其中的参数意义和 loads 方法相同。来看一个例子。
>>> import json
>>> from io import StringIO
>>> io = StringIO('["streaming API"]')
>>> json.load(io)
['streaming API']
本文主要介绍了 JSON 的定义,语法以及 JSON 的常用操作。但是并没有涉及 JSON 处理自定义数据类型的高级内容(JSONEncoder和JSONDecoder)