目录html
你必定据说过 JSON 吧。JSON 是当前最经常使用的数据传输格式之一,纯文本,容易使用,方便阅读,最重要的是在多个场合都被大量被使用。python
既然 JSON 这么好,那就让咱们继续探险,去掌握 python 中对 JSON 的经常使用操做吧, okay, let's go!编程
庄子曰:“水之积也不厚,则其负大舟也无力。”。要彻底掌握一个知识点,先将这个知识点须要的基础知识补齐,这样学的才能牢固。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 对象的结构是什么样子呢?
上面代码中的 obj
就是一个 JSON 对象,咱们来观察下它。
{}
括起来的一个集合,每一项都包含名称 和值 ,如 name
就是名称,而值就是 xxx
。obj
对象中嵌套了一个 address
对象,可是为了保证处理的高效性,请尽可能保持结构的扁平性,也就是不要嵌套太多层哦)为了可以处理 JSON 数据,许多语言都有对应的数据类型能够映射为 JSON 对象,那么 python 中是什么数据类型呢?
是 dict
,若是有您对 dict
有些遗忘了,就请到这里复习下吧。
上面代码中的 arr_simple
和 arr_complex
都表示数组,它们有哪些特色呢?
arr_complex
数组。python 也有可以映射为 JSON 对象的数据类型,是 list
和 tuple
, 若是您对 list
和 tuple
的特性有些生疏了,也能够在这里回顾下。
说到 JSON 和 python 之间的转换,就会涉及到两个名词:编码 和 解码。
那么到底什么是编码和解码呢?
编码是信息从一种形式或格式转换为另外一种形式的过程。解码,是编码的逆过程,亦即把编码过的信息恢复成原来样式。
——维基百科
编码的做用则是为了利于传输和存储,JSON 固然是很是适合的。所以,
刚开始接触 json 的操做,我主要有下面几个疑问:
下面就让咱们一一来探索这些问题。
使用 json 函数前须要先导入 json 库:
import json
json
库自己就是 python 内置的标准库,所以你不须要作任何安装的操做。只要声明了上面语句,就可直接使用。
要完成这个功能,先要看下 python 数据结构编码为 json 的对照表。
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float, int- & float-derived Enums | number |
True | true |
False | false |
None | null |
有了这张表,咱们就能够清楚的知道 python 对象将编码成的 json 格式。
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)
参数看起来好多啊,不过不用担忧,这么多参数,只有第一个参数是必填的。下面就来一一了解下这些参数的意义
False
。设置为 True
,假如 obj
中的 dict keys 不是基本类型(str
, int
, float
, bool
, None
), 就会被忽略,而不是抛出 TypeError
错误True
, 表示默认使用ascii 编码。若是 obj 内含有非 ASCII 字符,就会出现 "\uXXXX" 格式显式的数据, 设置成 False
就会使用字符原本的编码。
ensure_ascii=False
True
,若是设置为 False
就不会检查内部类型是否包含循环引用,并且循环引用会致使 OverflowErrorFalse
,若是碰到超过范围的 float
值(nan
, inf
, -inf
)就使用 (NaN
,Infinity
, -Infinity
) 替换
True
碰到这些值则会致使 ValueError
""
只会插入新的一行None
(也是默认值)会尽量的压缩(item_separator, key_separator)
(', ', ': ')
,表示 keys 之间用 ,
隔开,而 key 和 value 之间用 :
隔开False
,若是设置成 True
, dict 结构的输出就会按照 key 来排序来看一个例子
>>> 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()
函数的做用就是将 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 |
---|---|
object | dict |
array | list |
string | str |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
编码对照表和解码对照表并非一一对应的,所以若是一个 python对象 先编码成 JSON,再转码回来后获得的对象可就不必定彻底相等了。
这个方法的做用就是将参数 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
。
>>> 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(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
),这部份内容会再后面的篇章中专门介绍。
下篇会介绍 python 的模块,敬请期待。