需求
将任意一个json字符串,转换为python的object对象,转换后支持使用属性访问
代码
from argparse import Namespace
import json
def json_to_object(data):
return json.loads(data, object_hook=lambda d: Namespace(**d))
with open("default.json") as f:
args = json_to_object(f.read())
分析
默认情况下,json.loads()返回的是一个dict对象,不支持使用属性访问,因此极为不便
>>> import json
>>> s = json.loads('{"name":"rumor","age":25}')
>>> s
{u'age': 25, u'name': u'rumor'}
>>> type(s)
<type 'dict'>
>>> s.name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'name'
而json解析命令行使用的argparse,可以任意规定命令行关键字,并能使用属性访问。
查看argparse源码可以看到argparser调用parse_args()后返回的是一个Namespace对象,这里拿来借用一下;
同时,json.loads有个名为object_hook的参数,支持将object进行转换,因此结合起来就有了以上代码。