在复杂的json对象中找到字典键的值

时间:2018-12-01 05:59:10

标签: python json python-3.x dictionary

我已经为此工作了大约三天,我感到非常迷茫。我已经创建了一个脚本,可以使用Google API从Gmail下载单个邮件。我需要从该消息中提取“收件人”,“抄送”和“密件抄送”地址,并将它们存储在列表中。我最终将需要处理大量消息,但我什至不能从一条消息中提取这些值。 Gmail JSON对象是字典和列表对象的组合:

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)  

对于我的项目,我需要'To'地址的值(我最终还将需要CC和BCC数据,但是可以应用对'To'有用的任何方法来查找这些值)。早期的尝试是通过使用诸如“ msg ['payload'] ['headers'] [0] ['value']”之类的内容来简单地提取该值。这对于这条消息来说很好用,但是JSON结构似乎不一致,并且标头列表中“ To”的索引号是不可预测的。因此,我需要找到一种搜索所有'name:To'键并从该列表元素中提取值项的方法。我对此感到不知所措。

我在各种程序包中尝试了几种不同的JSON函数,但没有走运。我看着熊猫,认为那里可能有一些希望,但我无能为力。我尝试了简单的REGEX搜索,但是无法搜索dict对象。我试图展平字典,但是似乎并没有给我太大帮助(即使展平时,“ To”行也包含索引号,因此键有些不可预测)。我尝试了各种for循环,但发现很难遍历各个级别。我尝试了几种在网上找到的不同迭代器,但它们似乎对我没有用,尽管我怀疑我只是不知道自己在做什么。

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

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

解决方案

我想我找到了解决方案,并向社区表示歉意[em> [mountain] = [molehill] 。事实证明,更改的JSON对象的唯一部分是“标头”列表的长度,我可以轻松地浏览该列表并使用以下命令存储所有电子邮件地址:

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

针对三天问题的两线解决方案。现在,我将回头到我的洞穴...

0 个答案:

没有答案