导读

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
Nullnull
列表、元组数组
字典对象

JSON 编码

Python 提供了一个内置的 json 模块用于处理 Python数据 与 JSON数据 的相互转换操作。其中模块提供的 dumpsdump 方法用于将 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"
    }
}
最后修改:2021 年 04 月 02 日 05 : 14 PM
如果觉得我的文章对你有用,请随意赞赏