2

我正在尝试下载一个 json 文件,保存文件,然后遍历 json 文件以提取所有信息并将其保存为变量。然后,我将格式化一条 csv 格式的消息,以将数据发送到另一个系统。我的问题是json数据。它似乎是列表中的字典,我不确定如何处理它。

这是json:

[ {
  "ipAddress" : "",
  "feedDescription" : "Botted Node Feed",
  "bnFeedVersion" : "1.1.4",
  "generatedTs" : "2013-08-01 12:00:10.360+0000",
  "count" : 642903,
  "firstDiscoveredTs" : "2013-07-21 19:07:20.627+0000",
  "lastDiscoveredTs" : "2013-08-01 00:34:41.052+0000",
  "threatType" : "BN",
  "confidence" : 82,
  "discoveryMethod" : "spamtrap",
  "indicator" : true,
  "supportingData" : {
    "behavior" : "spamming",
    "botnetName" : null,
    "spamtrapData" : {
      "uniqueSubjectCount" : 88
    },
    "p2pData" : {
      "connect" : null,
      "port" : null
    }
  }
}, {
  "ipAddress" : "",
  "feedDescription" : "Botted Node Feed",
  "bnFeedVersion" : "1.1.4",
  "generatedTs" : "2013-08-01 12:00:10.360+0000",
  "count" : 28,
  "firstDiscoveredTs" : "2013-07-19 03:19:08.622+0000",
  "lastDiscoveredTs" : "2013-08-01 01:44:04.009+0000",
  "threatType" : "BN",
  "confidence" : 40,
  "discoveryMethod" : "spamtrap",
  "indicator" : true,
  "supportingData" : {
    "behavior" : "spamming",
    "botnetName" : null,
     "spamtrapData" : {
      "uniqueSubjectCount" : 9
    },
    "p2pData" : {
      "connect" : null,
      "port" : null
    }
  }
}, {
  "ipAddress" : "",
  "feedDescription" : "Botted Node Feed",
  "bnFeedVersion" : "1.1.4",
  "generatedTs" : "2013-08-01 12:00:10.360+0000",
  "count" : 160949,
  "firstDiscoveredTs" : "2013-07-16 18:52:33.881+0000",
  "lastDiscoveredTs" : "2013-08-01 03:14:59.452+0000",
  "threatType" : "BN",
  "confidence" : 82,
   "discoveryMethod" : "spamtrap",
  "indicator" : true,
  "supportingData" : {
    "behavior" : "spamming",
    "botnetName" : null,
    "spamtrapData" : {
      "uniqueSubjectCount" : 3
    },
     "p2pData" : {
      "connect" : null,
       "port" : null
    }
  }
 } ]

我的代码:

download = 'https:URL.BNfeed20130801.json'

request = requests.get(download, verify=False)
out  = open(fileName, 'w')
for row in request:
    if row.strip():
         for column in row:
                 out.write(column)
    else:
        continue
out.close()
time.sleep(4)
jsonRequest = request.json()

for item in jsonRequest:
     print jsonRequest[0]['ipAddress']
     print jsonRequest[item]['ipAddress'] --I also tried this

当我执行上述操作时,它只会一遍又一遍地打印相同的 IP。我已将打印语句放入仅用于测试目的。一旦我想出访问 JSON 的不同元素,我会将其存储在变量中,然后相应地使用这些变量。任何帮助是极大的赞赏。

提前感谢您的帮助。我在 Linux 上使用 Python 2.6。

4

2 回答 2

4

您基本上是在遍历 dicts 列表,请尝试item['ipAddress'].

于 2013-08-19T19:33:37.690 回答
2

alecxe 的回答告诉你如何解决这个问题,但让我试着解释一下原始代码有什么问题。


一旦您可以通过交互式可视化器运行,使用更简单的示例可能更容易理解:

a = ['a', 'b', 'c']

当你这样做时:

for item in a:

item将是'a'第一次通过,然后'b',然后'c'

但如果你这样做:

for item in a:
    print a[0]

……你完全忽略了item。它只会打印a3 次,因为每次您通过循环时,您只是在请求a[0]— 即a.

如果你这样做:

for item in a:
    print a[item]

......它会引发一个异常,因为你在请求'a'列表中的第 th 东西,这是无稽之谈。

但在这段代码中:

for item in a:
    print item

...您将打印'a', then 'b', then 'c',这正是您想要的。

你也可以这样做:

for index, item in enumerate(a):
    print a[index]

……但这很愚蠢。如果您需要索引,请使用enumerate,但如果您只需要项目本身……您已经得到它。


所以,回到你的真实代码:

for item in jsonRequest:
     print jsonRequest[0]['ipAddress']

同样,您每次都忽略item并要求。jsonRequest[0]

在这段代码中:

for item in jsonRequest:
    print jsonRequest[item]['ipAddress'] --I also tried this

......你要的是{complicated dictionary}th 的东西jsonRequest,这又是胡说八道。

但在这段代码中:

for item in jsonRequest:
    print item['ipAddress']

您正在使用每个项目,就像在简单示例中一样。

于 2013-08-19T20:06:51.320 回答