JSON如何快速转成对象?

FightingCoder

共 1514字,需浏览 4分钟

 ·

2023-10-05 23:13

这是「进击的Coder」的第 872  篇技术分享 作者:kingname 来源:未闻Code

阅读本文大概需要 3 分钟。



我们知道,在 Python 里面,要把 JSON 转成字典是非常容易的,只需要使用json.loads(JSON字符串)就可以了。

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

3f2adc0f844162ae2ec0beb771bc480a.webp

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

      result = info['data'][0]['entities']['annotations'][0]['end'] - info['data'][0]['entities']['annotations'][0]['start']

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

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

      result = info.data[0].entities.annotations[0].end - info.data[0].entities.annotations[0].start

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

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

      from types import SimpleNamespace

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

print(ins.bb)

运行效果如下图所示:

34b9fbd00b40787c4b06f32e5c63db27.webp

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

      from types import SimpleNamespace


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

print(ins.bb)

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

      x = json.loads(JSON字符串, object_hook=lambda d: SimpleNamespace(**d))

如下图所示:

6b878b3b11f06c888fd62b811f518c03.webp

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

参考资料

[1]

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

c16d69c84184685896fe493d76ede421.webp

End

欢迎大家加入【ChatGPT&AI 变现圈】,零门槛掌握 AI 神器!我们带你从小白到高手,解锁智能问答、自动化创作、技术变现的无限可能。与我们共同成长,开启 AI 新征程!立即行动,未来已来!(详情请戳:知识星球:ChatGPT&AI 变现圈,正式上线!

扫码加入:



好文和朋友一起看~
浏览 37
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报