JSON库

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。

在Python中,我们常常会涉及到JSON数据的处理,它通常用于不同的应用程序之间进行数据交换。 这些数据可以被编码为JSON 数据,并在 web 应用程序中通过 XMLHttpRequest 对象发送到服务器。

Python 中的 json 模块提供了将 Python 对象转换为 JSON 格式,以及将 JSON 格式转换为 Python 对象的方法。

本章节我们将为大家介绍如何使用 Python 语言来编码和解码 JSON 对象。

JSON 与 Python 字典的对应关系

JSON 是一种轻量级的数据格式,它由键/值对组成,并使用逗号进行分隔。例如,以下是一个简单的 JSON 对象:

{
    "name": "小明",
    "age": 18,
    "is_boy": true
}

Python 的字典对象也是由键/值对组成,并使用逗号进行分隔。 例如,以下是一个简单的 Python 字典:

{
    "name": "小明",
    "age": 18,
    "is_boy": True
}

可以看到,JSON 对象与 Python 字典具有相同的键/值对结构。 因此,我们可以使用 json.loads() 方法将 JSON 数据转换为 Python 字典。

python 原始类型向 json 类型的转化对照表:

Python JSON
dict object
list, tuple array
str, unicode string
int, long, float number
True true
False false
None null

JSON 库函数

使用 JSON 函数需要导入 json 库:import json

函数 描述
json.dumps 将 Python 对象编码成 JSON 字符串
json.loads 将已编码的 JSON 字符串解码为 Python 对象
json.dump() 将python对象编码成json数据并写入json文件中
json.load() 从json文件中读取数据并解码为Python对象

将 Python 对象转换为 JSON 数据(json.dumps)

除了将 JSON 数据转换为 Python 对象,我们还可以使用 json.dumps() 将 Python 对象转换为 JSON 数据。

  • 语法
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
  • obj: 表示是要序列化的对象。

  • fp: 文件描述符,将序列化的str保存到文件中。json模块总是生成str对象,而不是字节对象;因此,fp.write()必须支持str输入。

  • skipkeys: 默认为False,如果skipkeysTrue,(默认值:False),则将跳过不是基本类型(str,int,float,bool,None)的dict键,不会引发TypeError。

  • ensure_ascii: 默认值为True,能将所有传入的非ASCII字符转义输出。如果ensure_ascii为False,则这些字符将按原样输出。

  • check_circular:默认值为True,如果check_circular为False,则将跳过对容器类型的循环引用检查,循环引用将导致OverflowError。

  • allow_nan: 默认值为True,如果allow_nan为False,则严格遵守JSON规范,序列化超出范围的浮点值(nan,inf,-inf)会引发ValueError。 如果allow_nan为True,则将使用它们的JavaScript等效项(NaN,Infinity,-Infinity)。

  • indent: 设置缩进格式,默认值为None,选择的是最紧凑的表示。如果indent是非负整数或字符串,那么JSON数组元素和对象成员将使用该缩进级别进行输入;indent为0,负数或“”仅插入换行符;indent使用正整数缩进多个空格;如果indent是一个字符串(例如“\t”),则该字符串用于缩进每个级别。

  • separators: 去除分隔符后面的空格,默认值为None,如果指定,则分隔符应为(item_separator,key_separator)元组。如果缩进为None,则默认为(’,’,’:’);要获得最紧凑的JSON表示,可以指定(’,’,’:’)以消除空格。

  • default: 默认值为None,如果指定,则default应该是为无法以其他方式序列化的对象调用的函数。它应返回对象的JSON可编码版本或引发TypeError。如果未指定,则引发TypeError。

  • sort_keys: 默认值为False,如果sort_keys为True,则字典的输出将按键值排序。

以下实例将数组编码为 JSON 格式数据:

import json

data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]

data2 = json.dumps(data)
print(data2)

以上代码执行结果为:

[{"a": 1, "c": 3, "b": 2, "e": 5, "d": 4}]

使用参数让 JSON 数据格式化输出:

import json

data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]

data2 = json.dumps(data, sort_keys=True, indent=4, separators=(',', ': '))
print(data2)

以上代码执行结果为:

[
    {
        "a": 1,
        "b": 2,
        "c": 3,
        "d": 4,
        "e": 5
    }
]

例如,以下是将 Python 字典转换为 JSON 数据的示例:

import json

# 定义一个 Python 字典
data = {
    "name": "小明",
    "age": 18,
    "is_boy": True,
    "hobbies": ["游泳", "足球", "电影"],
    "address": {
        "city": "北京",
        "province": "北京市",
        "country": "中国"
    }
}

# 将 Python 字典转换为 JSON 数据
json_str = json.dumps(data)

# 打印 JSON 字符串
print(json_str)

输出结果为:

{"name": "小明", "age": 18, "is_boy": true, "hobbies": ["游泳", "足球", "电影"], "address": {"city": "北京", "province": "北京市", "country": "中国"}}

我们可以使用 json.dumps() 方法指定一些额外的参数,例如使用缩进和排序:

import json

# 定义一个 Python 字典
data = {
    "name": "小明",
    "age": 18,
    "is_boy": True,
    "hobbies": ["游泳", "足球", "电影"],
    "address": {
        "city": "北京",
        "province": "北京市",
        "country": "中国"
    }
}

# 将 Python 字典转换为 JSON 数据,使用缩进和排序
json_str = json.dumps(data, indent=4, sort_keys=True)

# 打印 JSON 字符串
print(json_str)

输出结果为:

{
    "address": {
        "city": "北京",
        "country": "中国",
        "province": "北京市"
    },
    "age": 18,
    "hobbies": [
        "游泳",
        "足球",
        "电影"
    ],
    "is_boy": true,
    "name": "小明"
}

将 JSON 数据转换为 Python 对象(json.loads)

json 模块提供了 loads() 函数来解析 JSON 数据并将其转换为 Python 对象。 loads() 函数接受一个字符串参数,该字符串包含 JSON 数据。该函数返回 Python 字段的数据类型。

  • 语法
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
  • s: 将s(包含JSON文档的str,bytes或bytearray实例)反序列化为Python对象。
  • encoding: 指定一个编码的格式。
  • loads也不需要文件描述符,其他参数的含义和load函数的一致。

以下实例展示了Python 如何解码 JSON 对象:

import json

jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

text = json.loads(jsonData)
print(text)

以上代码执行结果为:

{u'a': 1, u'c': 3, u'b': 2, u'e': 5, u'd': 4}

例如,以下是将 JSON 字符串转换为 Python 字典的示例:

import json

# 定义一个 JSON 字符串
json_str = '{"name": "小明", "age": 18, "is_boy": true}'

# 将 JSON 字符串转换为 Python 字典
data = json.loads(json_str)

# 打印 Python 字典对象
print(data)

输出结果为:

{'name': '小明', 'age': 18, 'is_boy': True}

如上所述,json.loads() 函数将 JSON 数据转换为 Python 字典对象。

解析包含数组的 JSON 数据

除了简单的 JSON 对象外,JSON 数据可能还包含数组。在 Python 中,我们可以使用 list 类型来表示数组。

例如,以下是一个包含数组的 JSON 数据:

{
    "name": "小明",
    "age": 18,
    "is_boy": true,
    "hobbies": ["游泳","足球","电影"]
}

在 Python 中,我们将上面的 JSON 数据解析为以下 Python 字典:

{
    "name": "小明",
    "age": 18,
    "is_boy": True,
    "hobbies": ["游泳", "足球", "电影"]
}

我们可以使用 json.loads() 将其解析为 Python 字典对象:

import json

# 定义一个 JSON 字符串
json_str = '{"name": "小明", "age": 18, "is_boy": true, "hobbies": ["游泳","足球","电影"]}'

# 将 JSON 字符串转换为 Python 字典
data = json.loads(json_str)

# 打印 Python 字典对象
print(data)

输出结果为:

{
    "name": "小明",
    "age": 18,
    "is_boy": True,
    "hobbies": ["游泳", "足球", "电影"]
}

解析嵌套的 JSON 数据

JSON 格式允许对象和数组作为值的嵌套。在 Python 中,我们可以使用嵌套的字典和列表来表示这种嵌套。

例如,以下是一个嵌套的 JSON 数据:

{
    "name": "小明",
    "age": 18,
    "is_boy": true,
    "hobbies": ["游泳","足球","电影"],
    "address": {
        "city": "北京",
        "province": "北京市",
        "country": "中国"
    }
}

在 Python 中,我们将上面的 JSON 数据解析为以下 Python 字典:

{
    "name": "小明",
    "age": 18,
    "is_boy": True,
    "hobbies": ["游泳", "足球", "电影"],
    "address": {
        "city": "北京",
        "province": "北京市",
        "country": "中国"
    }
}

我们可以使用 json.loads() 将其解析为 Python 字典对象:

import json

# 定义一个 JSON 字符串
json_str = '{"name": "小明", "age": 18, "is_boy": true, "hobbies": ["游泳","足球","电影"],"address": {"city": "北京","province": "北京市","country": "中国"}}'

# 将 JSON 字符串转换为 Python 字典
data = json.loads(json_str)

# 打印 Python 字典对象
print(data)

输出结果为:

{
    "name": "小明",
    "age": 18,
    "is_boy": True,
    "hobbies": ["游泳", "足球", "电影"],
    "address": {
        "city": "北京",
        "province": "北京市",
        "country": "中国"
    }
}

json文件相关

dump()和load()是json文件和python对象之间的转化

import json

data = {
    "key1": "值1",
    "key2": 222,
    "key3": [12, True, False, None, "1ab"]
}

with open("data.json", "w") as f:
    # 将Python对象存入json文件
    json.dump(data, f)

print("--------------------------")
with open("data.json", "r") as f:
    # 从文件中读取json数据并转成python对象
    content = json.load(f)
    print(type(content))
    print(content)

执行成功后,data.json文件内容如下(中文被Unicode编码了):

{"key1": "\u503c1", "key2": 222, "key3": [12, true, false, null, "1ab"]}

程序运行输出如下:

--------------------------
<class 'dict'>
{'key1': '值1', 'key2': 222, 'key3': [12, True, False, None, '1ab']}

模拟考题

考题1 单选题

有如下程序代码:

import json
s = '''[{"name":"kingsan","age":23},
        {"name":"xiaolan","age":22}]
    '''
print(type(s))
data = json.loads(s)
print(data)
print(type(data))

下列说法正确的是?( )

A. s的数据类型是list

B. data的数据类型是字符串

C. loads()用于将字符串转化为JSON对象

D. JSON数据可以用双引号来包围,也可以用单引号

答案:C

解析:s的数据类型是str,data的数据类型是list;loads()方法将字符串转化为JSON对象;JSON数据需要用双引号来包围,不能使用单引号,不然易出现解析错误。

考题2 判断题

JSON(JavaScript Object Notation 对象表示法)是一种流行的结构化数据的方式,可以使用json.loads()返回JSON字符串。( )

答案:错误

解析:loads()用于将字符串转化为JSON对象

考题3 判断题

JSON的loads和load方法的区别是,loads操作的是字符串,load操作的是文件流。( )

答案:正确

解析:JSON的loads和load方法的区别是,loads操作的是字符串,load操作的是文件流。

Copyright © all right reserved,powered by Gitbook该文件修订时间: 2023-10-28 15:53:48