首页 > 编程笔记 > Python笔记 阅读:50

Python中的JSON处理(非常详细)

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,不仅易于阅读和编写,还易于机器解析和生成。

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:

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"])
xavi
JSON 格式转换为 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 的字典格式。

相关文章