1 问题描述

JSON 格式的数据在和服务器通信过程中很常见,用 Python 处理我们可以用 json 库来读取,将其转化成一个字典。不过字典访问语法太繁琐了,我们需要将其转化一般对象,然后用访问类属性的方法去访问 Key-Value 对。直接硬写的非常繁琐,我们需要显式地讲类定义出来,然后一个个读取属性然后完成复制。我们需要一个更加符合 DRY (Dont Repeat Yourself) 原则的方法。

2 解决方法

下面是使用 SimpleNamespace 的做法:

1
2
3
4
5
6
7
8
import json
from types import SimpleNamespace

data = '{"name": "John Smith", "hometown": {"name": "New York", "id": 123}}'

# Parse JSON into an object with attributes corresponding to dict keys.
x = json.loads(data, object_hook=lambda d: SimpleNamespace(**d))
print(x.name, x.hometown.name, x.hometown.id)

转化成 namedtuple 的方法:

1
2
3
4
5
6
7
8
import json
from collections import namedtuple

data = '{"name": "John Smith", "hometown": {"name": "New York", "id": 123}}'

# Parse JSON into an object with attributes corresponding to dict keys.
x = json.loads(data, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
print x.name, x.hometown.name, x.hometown.id

SimpleNamespace 内部只是对字典类型做了封装,因此上面这个转换的效率会比较高。

3 参考链接