ZetCode

Python simplejson

最后修改于 2024 年 1 月 29 日

在本文中,我们将展示如何使用 Python simplejson 模块读取和写入 JSON 数据。

JSON

JSON(JavaScript 对象表示法)是一种轻量级的数据交换格式。它易于人类阅读和编写,也易于机器解析和生成。 application/json 是 JSON 的官方 Internet 媒体类型。 JSON 文件扩展名是 .json

simplejson 模块

simplejson 是一个简单、快速、完整且可扩展的 JSON 编码器和解码器,适用于 Python 2.5+ 和 Python 3.3+。 它是纯 Python 代码,没有依赖项。

simplejson 模块包含在现代 Python 版本中。 解码器可以处理任何指定编码(默认 UTF-8)的传入 JSON 字符串。

使用 simplejson

import json

要使用 simplejson 模块,我们导入 json

Simplejson 转换表

下表显示了数据类型在 Python 和 JSON 之间的转换方式。

PythonJSON
dict, namedtupleobject(对象)
list, tuple数组
str, unicode字符串
int, long, floatnumber(数字)
Truetrue
Falsefalse
Nonenull

json.dump

json.dump 方法将 Python 对象序列化为 JSON 格式的流到文件对象。

json_dump.py
#!/usr/bin/python

import json

data = {"name": "Jane", "age": 17}

with open('friends.json', 'w') as f:
    json.dump(data, f)

该示例使用 json.dump 方法将 Python 字典序列化为 JSON。 JSON 数据被写入 friends.json 文件。

$ cat friends.json
{"age": 17, "name": "Jane"}

执行脚本后,我们得到以下数据。

json.dumps

json.dumps 方法将 Python 对象序列化为 JSON 字符串。

json_dumps.py
#!/usr/bin/python

import json

data = [{"name": "Jane", "age": 17}, {"name": "Thomas", "age": 27}]

json_data = json.dumps(data)
print(repr(json_data))

该示例使用 json.dumps 方法将 Python 列表序列化为 JSON 字符串。 JSON 数据被打印到控制台。

$ ./json_dumps.py
'[{"name": "Jane", "age": 17}, {"name": "Thomas", "age": 27}]'

json.load

json.load 方法将包含 JSON 文档的文件对象反序列化为 Python 对象。

config.json
{
  "theme" : "bluespring",
  "size": "small",
  "splashscreen": "false"
}

config.json 文件包含以下数据。

read_config.py
#!/usr/bin/python

import json

with open('config.json') as f:

    config = json.load(f)

    print('Theme: {}'.format(config['theme']))
    print('Size: {}'.format(config['size']))
    print('Splash screen: {}'.format(config['splashscreen']))

该示例使用 json.loadconfig.json 文件读取配置数据,并将数据打印到终端。

$ ./read_config.py
Theme: bluespring
Size: small
Splash screen: false

json.loads

json.loads 方法将 JSON 字符串反序列化为 Python 对象。

simplejson_loads.py
#!/usr/bin/python

import json

json_data = '{"name": "Jane", "age": 17}'

data = json.loads(json_data)

print(type(json_data))
print(type(data))

print(data)

该示例将 JSON 字符串反序列化为 Python 字典。

$ ./simple.py
<class 'str'>
<class 'dict'>
{'name': 'Jane', 'age': 17}

Simplejson 从 URL 读取 JSON

以下示例从网页读取 JSON 数据。 我们从 http://time.jsontest.com 获取 JSON 数据。

$ curl http://time.jsontest.com
{
    "date": "08-08-2023",
    "milliseconds_since_epoch": 1691506979261,
    "time": "03:02:59 PM"
 }

对该站点的 GET 请求返回以下 JSON 字符串。

parse_json_url.py
#!/usr/bin/python

import json
import urllib.request

hres = urllib.request.urlopen('http://time.jsontest.com')

data = json.loads(hres.read().decode("utf-8"))

print('Unix time: {}'.format(data['milliseconds_since_epoch']))
print('Time: {}'.format(data['time']))
print('Date: {}'.format(data['date']))

在该示例中,我们使用 urllib.request 模块向网站发出请求。

data = json.loads(hres.read().decode("utf-8"))

从返回的响应中,我们使用 json.loads 方法将 JSON 字符串转换为 Python 字典。

print('Unix time: {}'.format(data['milliseconds_since_epoch']))
print('Time: {}'.format(data['time']))
print('Date: {}'.format(data['date']))

借助 Python 的 format 方法,我们将检索到的数据打印到控制台。

$ ./parse_json_url.py
Unix time: 1691507071395
Time: 03:04:31 PM
Date: 08-08-2023

美化打印

使用 simplejson,我们可以轻松地美化打印我们的数据。

pretty_print_json.py
#!/usr/bin/python

import json

json_data = {"name":"Audi", "model":"2012", "price":22000,
                 "colours":["gray", "red", "white"]}

data = json.dumps(json_data, sort_keys=True, indent=4 * ' ')

print(data)

使用 sort_keysindent 选项,我们可以很好地格式化 JSON 数据。

$ ./pretty_print_json.py
{
    "colours": [
        "gray",
        "red",
        "white"
    ],
    "model": "2012",
    "name": "Audi",
    "price": 22000
}

Simplejson 自定义类

Simplejson 仅序列化和反序列化转换表中列出的少量 Python 对象。 对于自定义 Python 对象,我们需要执行一些额外的步骤。

custom_class.py
#!/usr/bin/python

import json

class Person:

    def __init__(self, name, age):

        self.name = name
        self.age = age

p = Person("Lucy", 23)

json_data = json.dumps(p.__dict__)

print(repr(json_data))

在此示例中,我们将自定义对象序列化为 JSON。

json_data = json.dumps(p.__dict__)

技巧是使用 __dict__ 属性,该属性存储对象属性(名称和年龄)。

$ ./custom_class.py
'{"name": "Lucy", "age": 23}'

Simplejson 自定义类列表

在下一个示例中,我们将展示如何序列化自定义类的列表。

custom_class_list.py
#!/usr/bin/python

import json

class Person:

    def __init__(self, name, age):

        self.name = name
        self.age = age

    def toJson(self):
        '''
        Serialize the object custom object
        '''
        return json.dumps(self, default=lambda o: o.__dict__,
                sort_keys=True, indent=4)

p1 = Person("Lucy", 23)
p2 = Person("Thomas", 29)

people = []
people.append(json.loads(p1.toJson()))
people.append(json.loads(p2.toJson()))

json_data = json.dumps(people)

print(repr(json_data))

我们创建了一个 toJson 方法来序列化对象。

people = []
people.append(json.loads(p1.toJson()))
people.append(json.loads(p2.toJson()))

当我们向列表添加对象时,我们调用 toJson 方法。

$ ./custom_class_list.py
'[{"age": 23, "name": "Lucy"}, {"age": 29, "name": "Thomas"}]'

来源

Python json — JSON 编码器和解码器

在本文中,我们使用了 Python simplejson 库。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 我从 2007 年开始撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程