Python SimpleJson 教程展示了如何使用 Python SimpleJson 模块读取和写入 JSON 数据。
JSON 格式
JSON(JavaScript 对象表示法)是一种轻量级的数据交换格式。 它很容易被人读写,也可以由机器解析和生成。 application/json是 JSON 的官方互联网媒体类型。 JSON 文件扩展名是.json。
SimpleJson 模块
SimpleJson 是适用于 Python 2.5+和 Python 3.3+的简单,快速,完整且可扩展的 JSON 编码器和解码器。 它是没有依赖项的纯 Python 代码。
SimpleJson 模块包含在现代 Python 版本中。 解码器可以处理任何指定编码的传入 JSON 字符串(默认为 UTF-8)
使用 SimpleJson
import json
要使用 SimpleJson 模块,我们导入json。
SimpleJson 转换表
下表显示了如何在 Python 和 JSON 之间转换数据类型。
| Python | JSON 格式 |
|---|---|
| 字典,命名元组 | 对象 |
| 列表,元组 | 数组 |
str,unicode |
字符串 |
int,long,float |
数字 |
True |
true |
False |
false |
None |
null |
json.dump()
json.dump()方法将 Python 对象作为 JSON 格式的流序列化到文件对象。
simplejson_dump.py
#!/usr/bin/pythonimport jsondata = {"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 字符串。
simplejson_dumps.py
#!/usr/bin/pythonimport jsondata = [{"name": "Jane", "age": 17}, {"name": "Thomas", "age": 27}]json_data = json.dumps(data)print(repr(json_data))
该示例使用json.dumps()方法将 Python 列表序列化为 JSON 字符串。 JSON 数据被打印到控制台。
$ ./simplejson_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/pythonimport jsonwith 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.pyTheme: bluespringSize: smallSplash screen: false
这是输出。
json.loads()
json.loads()方法将 JSON 字符串反序列化为 Python 对象。
simplejson_loads.py
#!/usr/bin/pythonimport jsonjson_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{"time": "10:00:19 AM","milliseconds_since_epoch": 1496311219347,"date": "06-01-2017"}
对此站点的 GET 请求返回此 JSON 字符串。
parse_json_url.py
#!/usr/bin/pythonimport jsonimport urllib.requesthres = 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.pyUnix time: 1496311518866Time: 10:05:18 AMDate: 06-01-2017
这是输出。
精美打印
使用 SimpleJson,我们可以轻松精美打印数据。
pretty_print_json.py
#!/usr/bin/pythonimport jsonjson_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 对象,我们需要执行一些附加步骤。
custom_class.py
#!/usr/bin/pythonimport jsonclass Person(object):def __init__(self, name, age):self.name = nameself.age = agep = 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/pythonimport jsonclass Person(object):def __init__(self, name, age):self.name = nameself.age = agedef 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 教程, Python 列表推导式, Pyquery 教程, OpenPyXL 教程,[Python Requests 教程和 Python CSV 教程。
