Python中的JSON处理(非常详细)
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,不仅易于阅读和编写,还易于机器解析和生成。
JSON 采用完全独立于语言的文本格式,使用了类似 C语言家族的习惯(包括 C、C++、C#、Java、JavaScript、Perl、Python 等)。
JSON 的对象在花括号中,包含多个名称/值对,如:
JSON 的数组在方括号中,包含多个对象,如:
反序列化就是从存储区域(JSON、XML)读取反序列化对象的状态,并重新创建该对象。
Python 提供了 json 模块用于操作 JSON 格式。json 模块序列化与反序列化的过程分别是 encoding 和 decoding:
json.dumps() 带有很多参数,如 indent 参数是缩进的意思,可以使数据存储的格式变得更加优雅,代码为:
indent 参数可使输出的数据被格式化,可读性变得更强,是通过增加一些冗余的空白进行填充的。由于 JSON 主要是作为一种数据通信的格式存在的,而网络通信是很在乎数据大小的,无用的空格会占据通信带宽,因此需要对数据进行压缩。
json.dumps() 的 separators 参数可以起到这种作用。该参数传递的是一个元组,包含分隔对象的字符串,测试程序为:
Python 格式向 JSON 格式转化的对照表为:
JSON 采用完全独立于语言的文本格式,使用了类似 C语言家族的习惯(包括 C、C++、C#、Java、JavaScript、Perl、Python 等)。
JSON书写格式
JSON 的书写格式为:名称/值对,数据用逗号分隔,花括号保存对象,方括号保存数组。值可以为数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true或false)、数组(在方括号中)、对象(在花括号中)、null 等。JSON 的对象在花括号中,包含多个名称/值对,如:
{"name":"messi","age":30}
JSON 的数组在方括号中,包含多个对象,如:
{ "player": [ { "name":"messi" , "age":30 }, { "name":"xavi" , "age":36 }, { "name":"iniesta" , "age":33 } ] }
Python JSON编码
序列化(Serialization)就是将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以为 JSON、XML 等。反序列化就是从存储区域(JSON、XML)读取反序列化对象的状态,并重新创建该对象。
Python 提供了 json 模块用于操作 JSON 格式。json 模块序列化与反序列化的过程分别是 encoding 和 decoding:
- encoding(编码):把一个 Python 对象编码为 JSON 字符串。
- decoding(解码):把 JSON 格式的字符串编码为 Python 对象。
1) json.dumps()
Python 的 json 模块通过 json.dumps() 将 Python 对象编码为 JSON 字符串,代码为:>>> import json >>> data = {'a':1,'b':2} >>> type(data) <class 'dict'> >>> encode_json = json.dumps(data) >>> type(encode_json) <class 'str'> >>> print(encode_json) {"a": 1, "b": 2}
json.dumps() 带有很多参数,如 indent 参数是缩进的意思,可以使数据存储的格式变得更加优雅,代码为:
>>> data = {'a':1,'b':2} >>> encode_json = json.dumps(data,indent=4) >>> print(encode_json) { "a": 1, "b": 2 }
indent 参数可使输出的数据被格式化,可读性变得更强,是通过增加一些冗余的空白进行填充的。由于 JSON 主要是作为一种数据通信的格式存在的,而网络通信是很在乎数据大小的,无用的空格会占据通信带宽,因此需要对数据进行压缩。
json.dumps() 的 separators 参数可以起到这种作用。该参数传递的是一个元组,包含分隔对象的字符串,测试程序为:
>>> import json >>> data = {'a':1,'b':2} >>> len(repr(data)) 16 >>> len(json.dumps(data,indent=4)) 26 >>> len(json.dumps(data,separators=(',',':'))) 13通过该测试程序可知,使用 separators 参数的 JSON 格式的数据最短。
Python 格式向 JSON 格式转化的对照表为:
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
2) json.dump()
Python 的 json 模块通过 json.dump() 将 Python 的数据对象转换为 JSON 格式并写入文件,程序为:>>> import json >>> data = {'a':1,'b':2} >>> with open('dump.json','w') as f: ... json.dump(data,f) ...该程序会把 Python 字典中的 data 内容转换为 JSON 格式并写入当前目录的 dump.json 文件。
Python JSON解码
Python 的 json 模块通过 json.loads() 可解码 JSON 格式并返回 Python 字段的数据格式,程序为:>>> import json >>> org_json= '{"name":"messi", "type":[{"name":"xavi", "age":["1","2"]}]}' >>> decode_json = json.loads(org_json) >>> print(decode_json) {'type': {'age': ['1', '2'], 'name': 'xavi'}, 'name': 'messi'} >>> print(decode_json["name"]) messi >>> print(decode_json["type"]) {'age': ['1', '2'], 'name': 'xavi'} >>> print(decode_json["type"]["name"]) xaviJSON 格式转换为 Python 格式的对照表为:
JSON | Python |
---|---|
object | dict |
array | list |
string | unicode |
number (int) | int |
number (real) | float |
true | True |
false | False |
null | None |
1) json.load()
Python 的 json 模块通过 json.load() 可从 JSON 格式文件中读取数据,并将 JSON 格式的字符串转换为 Python 格式,程序为:>>> import json >>> with open('dump.json','r') as f: ... data = json.load(f) ... >>> print(data) {'a': 1, 'b': 2} >>> type(data) <class 'dict'>该程序会把当前目录下 dump.json 文件中的 JSON 格式数据转换为 Python 的字典格式。