# Python SimpleJson 教程

> 原文： [http://zetcode.com/python/simplejson/](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

```py
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`

```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`文件。

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

```

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

## `json.dumps()`

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

`simplejson_dumps.py`

```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 数据被打印到控制台。

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

```

这是示例的输出。

## `json.load()`

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

`config.json`

```py
{
  "theme" : "bluespring",
  "size": "small",
  "splashscreen": "false"
}

```

`config.json`文件包含此数据。

`read_config.py`

```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.load()`从`config.json`文件读取配置数据，并将数据打印到终端。

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

```

这是输出。

## `json.loads()`

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

`simplejson_loads.py`

```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 字典。

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

```

这是示例的输出。

## SimpleJson 从 URL 读取 JSON

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

```py
$ curl http://time.jsontest.com
{
   "time": "10:00:19 AM",
   "milliseconds_since_epoch": 1496311219347,
   "date": "06-01-2017"
}

```

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

`parse_json_url.py`

```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`模块创建对网站的请求。

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

```

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

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

```

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

```py
$ ./parse_json_url.py 
Unix time: 1496311518866
Time: 10:05:18 AM
Date: 06-01-2017

```

这是输出。

## 精美打印

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

`pretty_print_json.py`

```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_keys`和`indent`选项，我们可以很好地格式化 JSON 数据。

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

```

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

## SimpleJson 自定义类

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

`custom_class.py`

```py
#!/usr/bin/python

import json

class Person(object):

    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。

```py
json_data = json.dumps(p.__dict__)

```

诀窍是使用`__dict__`属性，该属性存储对象属性（名称和年龄）。

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

```

这是输出。

## 自定义类的 SimpleJson 列表

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

`custom_class_list.py`

```py
#!/usr/bin/python

import json

class Person(object):

    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()`方法来序列化该对象。

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

```

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

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

```

这是示例的输出。

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

您可能也会对以下相关教程感兴趣： [Python 教程](/lang/python/)， [Python 列表推导式](/articles/pythonlistcomprehensions/)， [Pyquery 教程](/python/pyquery)， [OpenPyXL 教程](/articles/openpyxl/)，[Python Requests 教程和 [Python CSV 教程](/python/csv/)。