【问题标题】:Recursively looping through JSON output in Python在 Python 中递归循环遍历 JSON 输出
【发布时间】:2015-08-11 18:27:47
【问题描述】:

我有以下 json 输出:

{  
   "code":0,
   "message":"success",
   "data":[  
      {  
         "group_id":"12345678901234567890",
         "display_name":"GROUP",
         "description":"Group 1",
         "monitors":[  
            "12345678901234567890",
            "12345678901234567890",
            "12345678901234567890"
         ]
      },
      {  
         "group_id":"12345678901234567890",
         "display_name":"KK-GROUP1",
         "description":"KK Group 1",
         "monitors":[  
            "12345678901234567890",
            "12345678901234567890",
            "12345678901234567890"
         ]
      },
      {  
         "group_id":"12345678901234567890",
         "display_name":"KK-GROUP2",
         "description":"KK Group 2",
         "monitors":[  
            "12345678901234567890",
            "12345678901234567890",
            "12345678901234567890"
         ]
      },
      {  
         "group_id":"12345678901234567890",
         "display_name":"KK-GROUP3",
         "description":"KK Group 3",
         "monitors":[  
            "12345678901234567890",
            "12345678901234567890",
            "12345678901234567890"
         ]
      }
   ]
}

我有这个定义,它应该遍历从 pycurl 命令接收到的 JSON 输出,并查找所有以 KK 开头的组,例如,从各个监视器字段中的所有 ID 创建一个列表以添加到另一个部分我写的脚本。在上面的输出中,它应该提供 9 个 ID(每组 3 个)......无论出于何种原因,它只获取前 3 个监视器 ID。

def ReturnedMonitors():
    listOfChecks = json.loads(connectSite('GET',''))
    for i in listOfChecks['data']:
        while i['display_name'].startswith(options.clusterName.upper()):
            return i['monitors']

此的输出将被传递到以下内容:

for monitor in ReturnedMonitors():
          putData = 'activate/' + monitor
          print "Activated: " + modifyMonitors('PUT',putData)

modifyMonitors 是另一个将发布到站点的 pycurl 定义。

【问题讨论】:

    标签: python json loops while-loop


    【解决方案1】:

    如果您尝试使用 - ReturnedMonitors() 创建生成器函数,则您创建错误,当您执行 return 它从函数返回时,您需要使用 yield 关键字,另外,如果您需要分别在 `monitors list 中产生每个 id ,你应该循环它们并分别产生。示例 -

    def ReturnedMonitors():
        listOfChecks = json.loads(connectSite('GET',''))
        for i in listOfChecks['data']:
            while i['display_name'].startswith(options.clusterName.upper()):
                for x in i['monitors']:
                    yield x
    

    对于 Python 3.3 + ,您可以使用 yield from 从可迭代/迭代器中生成所有值(称为生成器委托)-

    def ReturnedMonitors():
        listOfChecks = json.loads(connectSite('GET',''))
        for i in listOfChecks['data']:
            while i['display_name'].startswith(options.clusterName.upper()):
                yield from i['monitors']
    

    【讨论】:

    • 谢谢阿南德,这有帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-06-19
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多