导读
JSON
(全称:JavaScript Object Notation )是一种轻量级的数据交换格式,所谓的轻量级,是与 XML
数据结构相比而言的,在描述相同的数据下,JSON
所需的字符比XML
的要少,这就意味着相同意义的数据, JSON
能更快完成传输,所需的流量也会减少,所以在移动互联网中JSON
数据格式会用的更多。
关于 JSON
数据完整概述,可直访: 官网 查看。
JSON 数据类型
JSON
是一种非常灵活,具有高度可定制化的数据格式,其一般由以下几种数据类型单一或混合组成:
- number:整型数据;
- boolean:布尔类型数据,true或false;
- string:字符串数据;
- null:null;
- array:数组(Array),类似 Python 的列表 — [];
- object:类似 Python 的字典数据 — { Object:value }。
其中,对象(object) 和 数组(array) 为比较特殊且常用的两种类型:
J SON 对象
基本格式:
{“Object1”: "value1", “Object2”: "value2", ...}
JSON 对象数据格式与 Python字典类似,同样以键值对形式存在,外层使用大括号{}
包裹,Object 为“键”,value 为对应的“值”,“键”与“值”之间用冒号:
间隔,元素间用逗号,
间隔,其中 Object 可用数字或字符串表示,value 可以是任意类型的数据,可以是数字、字符串、字典、数组等。
示例:
{
"name": "taitai",
"birthday": "2000-1-1",
"hobby": "['basketball', 'football']",
"score": "{'chinese': '88', 'math': '95', 'english': '82'}"
}
JSON 数组
基本格式:
["element1", "element2", ...]
JSON
数组与 Python 列表数据的格式类似,均是一连串的元素集合,在 JSON
数组一个较为特殊的数据类型,它也可以像对象那样使用键值对,但还是索引使用得多。同样,其值的类型可以是任意类型。
示例:
[{
"name": "taitai",
"birthday": "2000-1-1",
},
{
"name": "taitai",
"birthday": "2000-1-1",
}
]
JSON
规定字符集必须为 UTF-8 编码。同时,为了统一解析,JSON
还规定 Object (键) 必须使用双引号""
包裹,且当 value(值) 为字符串数据时,也必须用双引号""
包裹。
JSON 编码 & 解码
在互联网中,如果需要传输对象数据,就需要先将该对象转化为 JSON
格式的字符串,这个过程称为“对象序列化(编码)”,反之,在接收到 JSON
字符串后,要转为目标对象使用时,就需要进行 “反序列化(解码)”,两者是互逆过程。
Python 数据与 JSON 数据映射关系
Python 数据 | JSON 数据 |
---|---|
整数、浮点数等数据类型 | 数字 |
字符串 | 字符串 |
布尔类型(True 、False) | true、false |
Null | null |
列表、元组 | 数组 |
字典 | 对象 |
JSON 编码
Python 提供了一个内置的 json
模块用于处理 Python数据 与 JSON数据 的相互转换操作。其中模块提供的 dumps
和 dump
方法用于将 Python 对象转换为 JSON
数据,即实现编码过程。
实例:
# coding=utf-8
import json
# 创建数据
data = {
'name': 'taitai',
'age': 18,
'hobby': ['basketball', 'football'],
'score': {'chinese': '88', 'math': '95', 'english': '82'}
}
print(data)
print(type(data)) # 编码前数据类型 <class 'dict'>
# dumps 编码(单行输出)
data2 = json.dumps(data)
print(data2)
print(type(data2)) # 编码后数据类型 <class 'str'>
# dumps 编码(排版输出,指定逐层跳格为 4)
data2 = json.dumps(data, indent=4)
print(data2)
# dump方法:将数据编码,并写入指定的文件
# 不排版
with open('./data2.json', 'w') as f:
json.dump(data2, f)
# 排版
with open('./data3.json', 'w') as f:
json.dump(data2, f, indent=4)
实例输出:
{'name': 'taitai', 'age': 18, 'hobby': ['basketball', 'football'], 'score': {'chinese': '88', 'math': '95', 'english': '82'}}
<class 'dict'>
{"name": "taitai", "age": 18, "hobby": ["basketball", "football"], "score": {"chinese": "88", "math": "95", "english": "82"}}
<class 'str'>
{
"name": "taitai",
"age": 18,
"hobby": [
"basketball",
"football"
],
"score": {
"chinese": "88",
"math": "95",
"english": "82"
}
}
同时还会在当前目录下创建 data2.json 和 data3.json 两个文件。
JSON 解码
上述实例实现了 JSON
的编码操作,前面也说了有编码就有解码,这是一个相互伴随的过程,json
模块同样提供了 loads()
和 load()
方法实现 JSON
数据的解码操作。
实例:
# coding=utf-8
import json
# 创建数据
json_data = r'{"name": "taitai", "age": 18, "hobby": ["basketball", "football"], "score": {"chinese": "88", "math": "95", "english": "82"}}'
print("json_data 数据:", json_data)
print("json_data 数据类型:", type(json_data)) # <class 'str'>
# 解码
data = json.loads(json_data)
print("data 数据:", data)
print("data 数据类型:", type(data)) # <class 'dict'>
print(data['name'])
print(data['hobby'])
print(data['score'])
# 解码 JSON 文件
with open('./data2.json', 'r') as f: # 使用前面编码生成的 JSON 文件
data2 = json.load(f)
print("JSON 文件解码后,内容为:\n", data2)
实例输出:
json_data 数据: {"name": "taitai", "age": 18, "hobby": ["basketball", "football"], "score": {"chinese": "88", "math": "95", "english": "82"}}
json_data 数据类型: <class 'str'>
data 数据: {'name': 'taitai', 'age': 18, 'hobby': ['basketball', 'football'], 'score': {'chinese': '88', 'math': '95', 'english': '82'}}
data 数据类型: <class 'dict'>
taitai
['basketball', 'football']
{'chinese': '88', 'math': '95', 'english': '82'}
JSON 文件解码后,内容为:
{
"name": "taitai",
"age": 18,
"hobby": [
"basketball",
"football"
],
"score": {
"chinese": "88",
"math": "95",
"english": "82"
}
}