前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一日一技:JSON如何快速转成对象?

一日一技:JSON如何快速转成对象?

作者头像
青南
发布2023-09-24 14:48:41
2350
发布2023-09-24 14:48:41
举报
文章被收录于专栏:未闻Code未闻Code
我们知道,在Python里面,要把JSON转成字典是非常容易的,只需要使用json.loads(JSON字符串)就可以了。

但如果这个JSON转成的字典,嵌套比较深,那么要读取里面的数据就非常麻烦了。如下图所示:

如果我要读取把图中的end减去start字段,那么用字典的时候,代码要写成这样:

代码语言:javascript
复制
result = info['data'][0]['entities']['annotations'][0]['end'] - info['data'][0]['entities']['annotations'][0]['start']

光是看到这些方括号和单引号,就够让人头晕了。

但如果改成下面这样,看起来就清爽多了:

代码语言:javascript
复制
result = info.data[0].entities.annotations[0].end - info.data[0].entities.annotations[0].start

那么如何快速把一个嵌套很深的字典转换为对象呢?其实非常简单,使用Python自带的SimpleNamespace就可以了。

使用SimpleNamespace可以快速创建一个空对象,并设置它的属性,用法如下:

代码语言:javascript
复制
from types import SimpleNamespace

ins = SimpleNamespace(aa=1, bb=2, cc=3)

print(ins.bb)

运行效果如下图所示:

基于字典创建也非常简单:

代码语言:javascript
复制
from types import SimpleNamespace


data = {'aa': 1, 'bb': 2, 'cc': 3}
ins = SimpleNamespace(**data)

print(ins.bb)

对于深层嵌套的JSON字符串,我们在使用json.loads时,额外设置一个参数:object_hook,就可以实现递归式转换内层字典:

代码语言:javascript
复制
x = json.loads(JSON字符串, object_hook=lambda d: SimpleNamespace(**d))

如下图所示:

关于参数object_hook的具体用法,大家可以看官方文档[1]

参考资料

[1]

官方文档: https://docs.python.org/3/library/json.html#json.loads

END

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-09-22 09:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档