- 数据表示
- 数据类型
- 解析 JSON 数据
- 生成 JSON 数据
JSON 全称:Javascript Object Notation(Javascript 对象表示法),是一种轻量级的文本数据交换格式。与接下来要介绍的 XML 相比,拥有 更小、更快、更易解析的特点。
一个典型的 JSON 格式的字符串如下:
- {
- "students":
- [
- { "name":"赵昊" , "age": 15 },
- { "name":"龙傲天" , "age": 16 },
- { "name":"叶良辰" , "age": 17 }
- ]
- }
可以看到其结构和 Python 的list、dict有点相似。
数据表示
JSON 中数据都以名称:值的形式表示,名称包括在一对双引号" "中,值则有多种形式,多条数据之间用逗号,隔开,比如:
- "name":"赵昊"
- "name":"赵昊","age":15
这种表示方式与 Python 的dict类似。
数据类型
JSON 的值可以是如下类型:
- 字符串(在双引号中)
- 数字(整数或浮点数)
- 逻辑值(true 或 false)
- 数组(在中括号中)
- 对象(在大括号中)
- null
比如:
- "name":"赵昊" , "age":15 , "height":170.5 , "ismale" : false , house":null
数组 JSON 的数组用一对方括号[]表示,类似于list,数组元素用逗号,隔开,元素值可以是任意 JSON 数据类型,比如:
- "names":["赵昊","龙傲天","叶良辰"]
- "ages":[15,16,17]
对象 JSON 的对象用一对大括号{}表示,类似于dict,对象可以拥有多个名称/值 对,名称/值 对用逗号,隔开,比如:
- "first":{ "name":"赵昊" , "age": 15 }
库是 Python 内置的一个用于操作 JSON 数据的库,提供了几个函数用于解析与生成(或者说反序列化与序列化)JSON 格式的数据。
解析 JSON 数据
json库提供了一个函数loads,用于从 Python 的字符串中解析 JSON 数据。使用它的方法很简单,只需将含有 JSON 数据的字符串当做参数传递给它,它的返回值就是由 Python 中的基础数据类型组成的对象。
- import json
- data = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
- text = json.loads(data)
- print(text)
得到的结果是:
- {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
JSON 的对象类型转换成了 Python 的dict类型。
JSON 各种数据类型在解析后,对应的 Python 基础数据类型如下表:
| JSON | Python |
|---|---|
| object(对象) | dict |
| array(数组) | list |
| string(字符串) | unicode |
| number (int) | int, long |
| number (real) | float |
| true | True |
| false | False |
| null | None |
JSON 数据类型转化成 Python 数据类型后,就可以按照 Python 的方式来使用了:
- import json
- data = '[1,2,3]';
- text = json.loads(data)
- text.append(4) #调用list的append函数
- print(text)
得到的结果是:
- [1, 2, 3, 4]
如果需要以不同的字符编码来解析,可以指定 encoding 参数,比如:
- import json
- data = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
- text = json.loads(data,encoding = "utf-8")
- print(text)
上面的代码以 utf-8 的字符编码,解析 data 字符串的数据。
注意:如果字符编码指定错误,有可能会导致解析失败,引发异常。
json 库的另一个函数 load 也是用于解析 JSON 数据的,它与 loads 函数唯一不同的地方在于,它是从文件中解析,比如:
- import json
- data = open("test.txt","r",encoding = "utf-8")
- text = json.load(data) #将文件对象传递给load函数
- print(text)
- fp.close()
这样 test.txt 文件内的内容,就会被当做 JSON 格式的数据来解析。
注意:load 函数没有可选参数 encoding ,只要文件对象使用了正确的字符编码打开文件,load 函数就可以正确的解析数据。
生成 JSON 数据
与解析的那两个函数相对应,json 库也提供了两个函数:dumps 和 dump ,来将由 Python 基础数据类型组成的对象转化成 JSON 数据,使用方法也类似:
- import json
- data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]
- json = json.dumps(data) #转化成JSON格式的字符串
- print(json)
得到的结果是:
- [{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}]
注意:这是一个字符串。
同样,在转化的时候,也有一个 Python 基础数据类型到 JSON 数据类型的对应表格:
| Python | JSON |
|---|---|
| dict | object |
| list, tuple | array |
| str, unicode | string |
| int, long, float | number |
| True | true |
| False | false |
| None | null |
注意:dumps 没有可选参数 encoding ,当要转化的对象含有中文等非 ASCII 字符时,建议指定可选参数 ensure_ascii 为 False 。否则非 ASCII 的字符将会被显示成 uXXXX 的形式。
- data = {"name":"小明"}
- print(json.dumps(data)) #ensure_ascii默认值为True
- print(json.dumps(data,ensure_ascii= False)) #指定ensure_ascii为False
上面的代码的结果:
- {"name": "u5c0fu660e"}
- {"name": "小明"}
使用 dump 函数直接输出到文件也很简单,只需多传递一个文件对象作为参数。
- import json
- fp = open("test.txt","w")
- data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]
- json.dump(data,fp) #转化成JSON格式的字符串后输出到文件
- fp.close()
test.txt文件的内容:
- [{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}]
dump 函数同样也没有可选参数 encoding ,如果数据中有中文字符等非 ASCII 字符时,建议指定可选参数 ensure_ascii 为 False 。



