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 之间的转换方式。
Python | JSON |
---|---|
dict, namedtuple | object(对象) |
list, tuple | 数组 |
str, unicode | 字符串 |
int, long, float | number(数字) |
True | true |
False | false |
None | null |
json.dump
json.dump
方法将 Python 对象序列化为 JSON 格式的流到文件对象。
#!/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 字符串。
#!/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 对象。
{ "theme" : "bluespring", "size": "small", "splashscreen": "false" }
config.json
文件包含以下数据。
#!/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.load
从 config.json
文件读取配置数据,并将数据打印到终端。
$ ./read_config.py Theme: bluespring Size: small Splash screen: false
json.loads
json.loads
方法将 JSON 字符串反序列化为 Python 对象。
#!/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 字符串。
#!/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,我们可以轻松地美化打印我们的数据。
#!/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_keys
和 indent
选项,我们可以很好地格式化 JSON 数据。
$ ./pretty_print_json.py { "colours": [ "gray", "red", "white" ], "model": "2012", "name": "Audi", "price": 22000 }
Simplejson 自定义类
Simplejson 仅序列化和反序列化转换表中列出的少量 Python 对象。 对于自定义 Python 对象,我们需要执行一些额外的步骤。
#!/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 自定义类列表
在下一个示例中,我们将展示如何序列化自定义类的列表。
#!/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 simplejson 库。
作者
列出所有 Python 教程。