在Python中递归循环JSON输出

2024-06-10 02:29:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下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开头的所有组,例如,从各个monitors字段中的所有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定义。你知道吗


Tags: nameidjsondata定义displaygroupdescription
1条回答
网友
1楼 · 发布于 2024-06-10 02:29:52

如果您试图用-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

对于python3.3+,可以使用^{}从iterable/iterator(称为generator delegation)生成所有值-

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

相关问题 更多 >