原文: http://zetcode.com/python/simplejson/

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

  1. import json

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

SimpleJson 转换表

下表显示了如何在 Python 和 JSON 之间转换数据类型。

Python JSON 格式
字典,命名元组 对象
列表,元组 数组
strunicode 字符串
intlongfloat 数字
True true
False false
None null

json.dump()

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

simplejson_dump.py

  1. #!/usr/bin/python
  2. import json
  3. data = {"name": "Jane", "age": 17}
  4. with open('friends.json', 'w') as f:
  5. json.dump(data, f)

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

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

执行脚本后,我们得到了这些数据。

json.dumps()

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

simplejson_dumps.py

  1. #!/usr/bin/python
  2. import json
  3. data = [{"name": "Jane", "age": 17}, {"name": "Thomas", "age": 27}]
  4. json_data = json.dumps(data)
  5. print(repr(json_data))

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

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

这是示例的输出。

json.load()

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

config.json

  1. {
  2. "theme" : "bluespring",
  3. "size": "small",
  4. "splashscreen": "false"
  5. }

config.json文件包含此数据。

read_config.py

  1. #!/usr/bin/python
  2. import json
  3. with open('config.json') as f:
  4. config = json.load(f)
  5. print('Theme: {}'.format(config['theme']))
  6. print('Size: {}'.format(config['size']))
  7. print('Splash screen: {}'.format(config['splashscreen']))

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

  1. $ ./read_config.py
  2. Theme: bluespring
  3. Size: small
  4. Splash screen: false

这是输出。

json.loads()

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

simplejson_loads.py

  1. #!/usr/bin/python
  2. import json
  3. json_data = '{"name": "Jane", "age": 17}'
  4. data = json.loads(json_data)
  5. print(type(json_data))
  6. print(type(data))
  7. print(data)

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

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

这是示例的输出。

SimpleJson 从 URL 读取 JSON

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

  1. $ curl http://time.jsontest.com
  2. {
  3. "time": "10:00:19 AM",
  4. "milliseconds_since_epoch": 1496311219347,
  5. "date": "06-01-2017"
  6. }

对此站点的 GET 请求返回此 JSON 字符串。

parse_json_url.py

  1. #!/usr/bin/python
  2. import json
  3. import urllib.request
  4. hres = urllib.request.urlopen('http://time.jsontest.com')
  5. data = json.loads(hres.read().decode("utf-8"))
  6. print('Unix time: {}'.format(data['milliseconds_since_epoch']))
  7. print('Time: {}'.format(data['time']))
  8. print('Date: {}'.format(data['date']))

在该示例中,我们使用urllib.request模块创建对网站的请求。

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

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

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

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

  1. $ ./parse_json_url.py
  2. Unix time: 1496311518866
  3. Time: 10:05:18 AM
  4. Date: 06-01-2017

这是输出。

精美打印

使用 SimpleJson,我们可以轻松精美打印数据。

pretty_print_json.py

  1. #!/usr/bin/python
  2. import json
  3. json_data = {"name":"Audi", "model":"2012", "price":22000,
  4. "colours":["gray", "red", "white"]}
  5. data = json.dumps(json_data, sort_keys=True, indent=4 * ' ')
  6. print(data)

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

  1. $ ./pretty_print_json.py
  2. {
  3. "colours": [
  4. "gray",
  5. "red",
  6. "white"
  7. ],
  8. "model": "2012",
  9. "name": "Audi",
  10. "price": 22000
  11. }

这是示例的输出。 数据缩进并对键进行排序。

SimpleJson 自定义类

SimpleJson 仅序列化和反序列化一些 Python 对象,这些对象在转换表中列出。 对于自定义 Python 对象,我们需要执行一些附加步骤。

custom_class.py

  1. #!/usr/bin/python
  2. import json
  3. class Person(object):
  4. def __init__(self, name, age):
  5. self.name = name
  6. self.age = age
  7. p = Person("Lucy", 23)
  8. json_data = json.dumps(p.__dict__)
  9. print(repr(json_data))

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

  1. json_data = json.dumps(p.__dict__)

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

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

这是输出。

自定义类的 SimpleJson 列表

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

custom_class_list.py

  1. #!/usr/bin/python
  2. import json
  3. class Person(object):
  4. def __init__(self, name, age):
  5. self.name = name
  6. self.age = age
  7. def toJson(self):
  8. '''
  9. Serialize the object custom object
  10. '''
  11. return json.dumps(self, default=lambda o: o.__dict__,
  12. sort_keys=True, indent=4)
  13. p1 = Person("Lucy", 23)
  14. p2 = Person("Thomas", 29)
  15. people = []
  16. people.append(json.loads(p1.toJson()))
  17. people.append(json.loads(p2.toJson()))
  18. json_data = json.dumps(people)
  19. print(repr(json_data))

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

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

将对象添加到列表时,我们将调用toJson()方法。

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

这是示例的输出。

在本教程中,我们使用了 Python SimpleJson 库。

您可能也会对以下相关教程感兴趣: Python 教程Python 列表推导式Pyquery 教程OpenPyXL 教程,[Python Requests 教程和 Python CSV 教程