首页 > 解决方案 > 在复杂的 json 对象中查找 dict 键的值

问题描述

我已经为此工作了大约三天,并且尽我所能。我创建了一个脚本,该脚本使用 Google API 从 Gmail 下载单个邮件。我需要从该消息中提取收件人、抄送和密送地址并将它们存储在一个列表中。我最终需要处理大量消息,但我什至无法从一条消息中提取这些值。Gmail JSON 对象是 dict 和 list 对象的混合体:

msg (dict-8)  
--historyID (str-1)  
--id (str-1)  
--internalDate (str-1)  
--labelIds (list-1)  
--payload (dict-2)  
-- --headers (list-1)  
-- -- --unnamed index 0 (dict-2)  
-- -- -- --name:To (str-1)  
-- -- -- --value:gself@gmail.com (str-1)  
-- --mimeType (str-1)  
--sizeEstimate (int-1)  
--snippet (str-1)  
--threadId (str-1)  

对于我的项目,我需要“收件人”地址的值(我最终还需要抄送和密件抄送数据,但可以应用任何适用于“收件人”的内容来查找这些值)。早期的努力是通过使用“msg['payload']['headers'][0]['value']”之类的内容导航到该值来简单地提取该值。这对于这条消息来说效果很好,但 JSON 结构似乎不一致,并且标题列表中“To”的索引号是不可预测的。所以我需要找到一种方法来搜索所有 'name:To' 键并从该列表元素中提取值项。在这件事上我有点过头了。

我在各种包中尝试了几种不同的 JSON 函数,但没有运气。我看着 Pandas 并认为那里可能有一些希望,但我无法弄清楚。我尝试了一个简单的 REGEX 搜索,但我无法搜索 dict 对象。我尝试压平 dict 但这似乎并没有给我太多帮助(即使是平的,'To' 行也包含索引号,所以键有点不可预测)。我尝试了各种 for 循环,但发现很难遍历关卡。我尝试了几种在网上找到的不同迭代器,但它们似乎对我不起作用,尽管我怀疑我根本不知道自己在做什么。

我想出的唯一可能的解决方案是使用 json.dumps 将 dict 转储到一个变量中,然后对该变量中的电子邮件地址进行正则表达式搜索。虽然我认为这应该可行,但令我震惊的是,必须有一个比创建变量并在该变量中搜索更直接的解决方案。

是否有一个包可以帮助我从 Gmail JSON 对象的列表中提取隐藏元素(电子邮件地址)?也许我可以搜索出现在任何值中的电子邮件地址,但我不确定如何在结构中向下搜索三个级别。也许有人开发了一个可以搜索 JSON 对象的函数。也许还有另一种解决方案,我只是没有足够的经验来自己制作。我非常感谢我能得到的任何帮助。

解决方案

我想我找到了解决方案,并应为[mountain]=[molehill]向社区道歉。事实证明,JSON 对象中唯一改变的部分是“标题”列表的长度,我可以轻松浏览该列表并使用以下内容存储所有电子邮件地址:

for getAddr in msg['payload']['headers']:
    msgAddr += (getAddr['value'])

三天问题的两行解决方案。现在我要溜回我的洞穴...

标签: pythonjsonpython-3.xdictionary

解决方案


推荐阅读