2012-08-09 104 views
5
import json 
import urllib 
import urllib2 
url = "https://www.virustotal.com/vtapi/v2/file/report" 
parameters = {"resource": "2aa837802b1c7867a65067525a843566029bd97e3ce99f6eb55217e219043ae1", 
     "apikey": "123123123123123123"} 
data = urllib.urlencode(parameters) 
req = urllib2.Request(url, data) 
response = urllib2.urlopen(req) 

json_object = json.load(response) 

print json_object['scans'] 

请问如何在我的代码返回的JSON对象中获取特定值?该代码连接到VirusTotal以获取对象扫描结果。如何使用python获取JSON对象中的值/内容

我试图用最后一行代码打印它,但它打印整个输出。

JSON对象看起来是这样的:

{ 
    "scans": { 
     "TotalDefense": { 
      "detected": false, 
      "version": "37.0.10022", 
      "result": null, 
      "update": "20120809" 
     }, 
     "nProtect": { 
      "detected": false, 
      "version": "2012-08-09.02", 
      "result": null, 
      "update": "20120809" 
     }, 
     "CAT-QuickHeal": { 
      "detected": false, 
      "version": "12.00", 
      "result": null, 
      "update": "20120809" 
     }, 
     "McAfee": { 
      "detected": false, 
      "version": "5.400.0.1158", 
      "result": null, 
      "update": "20120809" 
     }, 
     "K7AntiVirus": { 
      "detected": false, 
      "version": "9.145.7456", 
      "result": null, 
      "update": "20120808" 
     }, 
     "TheHacker": { 
      "detected": false, 
      "version": "None", 
      "result": null, 
      "update": "20120808" 
     }, 
     "VirusBuster": { 
      "detected": false, 
      "version": "15.0.138.0", 
      "result": null, 
      "update": "20120809" 
     }, 
     "F-Prot": { 
      "detected": false, 
      "version": "4.6.5.141", 
      "result": null, 
      "update": "20120809" 
     }, 
     "Symantec": { 
      "detected": false, 
      "version": "20121.1.0.298", 
      "result": null, 
      "update": "20120809" 
     }, 
     "Norman": { 
      "detected": false, 
      "version": "6.08.06", 
      "result": null, 
      "update": "20120809" 
     }, 
     "ByteHero": { 
      "detected": false, 
      "version": "1.0.0.1", 
      "result": null, 
      "update": "20120723" 
     }, 
     "TrendMicro-HouseCall": { 
      "detected": false, 
      "version": "9.500.0.1008", 
      "result": null, 
      "update": "20120809" 
     }, 
     "Avast": { 
      "detected": false, 
      "version": "6.0.1289.0", 
      "result": null, 
      "update": "20120809" 
     }, 
     "eSafe": { 
      "detected": false, 
      "version": "7.0.17.0", 
      "result": null, 
      "update": "20120808" 
     }, 
     "ClamAV": { 
      "detected": false, 
      "version": "0.97.3.0", 
      "result": null, 
      "update": "20120809" 
     }, 
     "Kaspersky": { 
      "detected": false, 
      "version": "9.0.0.837", 
      "result": null, 
      "update": "20120809" 
     }, 
     "BitDefender": { 
      "detected": false, 
      "version": "7.2", 
      "result": null, 
      "update": "20120809" 
     }, 
     "ViRobot": { 
      "detected": false, 
      "version": "2011.4.7.4223", 
      "result": null, 
      "update": "20120809" 
     }, 
     "Sophos": { 
      "detected": false, 
      "version": "4.80.0", 
      "result": null, 
      "update": "20120809" 
     }, 
     "Comodo": { 
      "detected": false, 
      "version": "13190", 
      "result": null, 
      "update": "20120809" 
     }, 
     "F-Secure": { 
      "detected": false, 
      "version": "9.0.16440.0", 
      "result": null, 
      "update": "20120809" 
     }, 
     "DrWeb": { 
      "detected": false, 
      "version": "7.0.3.07130", 
      "result": null, 
      "update": "20120809" 
     }, 
     "VIPRE": { 
      "detected": false, 
      "version": "12556", 
      "result": null, 
      "update": "20120809" 
     }, 
     "AntiVir": { 
      "detected": false, 
      "version": "7.11.39.82", 
      "result": null, 
      "update": "20120809" 
     }, 
     "TrendMicro": { 
      "detected": false, 
      "version": "9.561.0.1027", 
      "result": null, 
      "update": "20120809" 
     }, 
     "McAfee-GW-Edition": { 
      "detected": false, 
      "version": "2012.1", 
      "result": null, 
      "update": "20120808" 
     }, 
     "Emsisoft": { 
      "detected": false, 
      "version": "5.1.0.11", 
      "result": null, 
      "update": "20120809" 
     }, 
     "Jiangmin": { 
      "detected": false, 
      "version": "13.0.900", 
      "result": null, 
      "update": "20120809" 
     }, 
     "Antiy-AVL": { 
      "detected": false, 
      "version": "2.0.3.7", 
      "result": null, 
      "update": "20120808" 
     }, 
     "Microsoft": { 
      "detected": false, 
      "version": "1.8601", 
      "result": null, 
      "update": "20120809" 
     }, 
     "SUPERAntiSpyware": { 
      "detected": false, 
      "version": "4.40.0.1006", 
      "result": null, 
      "update": "20120809" 
     }, 
     "GData": { 
      "detected": false, 
      "version": "22", 
      "result": null, 
      "update": "20120809" 
     }, 
     "Commtouch": { 
      "detected": false, 
      "version": "5.3.2.6", 
      "result": null, 
      "update": "20120809" 
     }, 
     "AhnLab-V3": { 
      "detected": false, 
      "version": "2012.08.09.00", 
      "result": null, 
      "update": "20120808" 
     }, 
     "VBA32": { 
      "detected": false, 
      "version": "3.12.18.2", 
      "result": null, 
      "update": "20120809" 
     }, 
     "PCTools": { 
      "detected": false, 
      "version": "8.0.0.5", 
      "result": null, 
      "update": "20120809" 
     }, 
     "ESET-NOD32": { 
      "detected": false, 
      "version": "7370", 
      "result": null, 
      "update": "20120809" 
     }, 
     "Rising": { 
      "detected": false, 
      "version": "24.22.02.05", 
      "result": null, 
      "update": "20120809" 
     }, 
     "Ikarus": { 
      "detected": false, 
      "version": "T3.1.1.122.0", 
      "result": null, 
      "update": "20120809" 
     }, 
     "Fortinet": { 
      "detected": false, 
      "version": "4.3.398.0", 
      "result": null, 
      "update": "20120809" 
     }, 
     "AVG": { 
      "detected": false, 
      "version": "10.0.0.1190", 
      "result": null, 
      "update": "20120809" 
     }, 
     "Panda": { 
      "detected": false, 
      "version": "10.0.3.5", 
      "result": null, 
      "update": "20120809" 
     } 
    }, 
    "scan_id": "2aa837802b1c7867a65067525a843566029bd97e3ce99f6eb55217e219043ae1-1344514045", 
    "sha1": "1bebf3ff83636e19cb8e26b6d46472c614aac7ab", 
    "resource": "2aa837802b1c7867a65067525a843566029bd97e3ce99f6eb55217e219043ae1", 
    "response_code": 1, 
    "scan_date": "2012-08-09 12:07:25", 
    "permalink": "https://www.virustotal.com/file/2aa837802b1c7867a65067525a843566029bd97e3ce99f6eb55217e219043ae1/analysis/1344514045/", 
    "verbose_msg": "Scan finished, scan information embedded in this object", 
    "total": 42, 
    "positives": 0, 
    "sha256": "2aa837802b1c7867a65067525a843566029bd97e3ce99f6eb55217e219043ae1", 
    "md5": "6aadd888170411af8aaa0bd8ebffeba4" 
} 
+0

因此'print json_object ['scans']'真的输出'scan_id','sha1'等等? – 2012-08-09 14:15:37

+0

如果您向我们展示了代码的输出,可能是JSON对象不符合您的期望。你可以添加一个打印json_object到你的代码并向我们展示输出吗? – ernie 2012-08-09 14:23:56

+1

文档非常清晰,我认为你实际上得到了'scans'的内容,但它不是你想要的。我建议阅读有关如何使用字典,列表等的Python文档。 – 2012-08-09 14:26:43

回答

4

使用json.loads它将JSON字符串转换为包含类型的字典的字典,列表等

编辑2: 您可以访问像每个项目这个:json_object['scans']['TotalDefense']['version'] 继续。 但是您可能还需要json.loads(json.load(response)),正如我在下面的评论中所述。

编辑1: 在您的示例中,我们不应再为print json_object['scans']看到"scans"


http://docs.python.org/library/json.html

>>> import json 
>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') 
[u'foo', {u'bar': [u'baz', None, 1.0, 2]}] 

该网页中也有关于如何做更复杂的解码信息。

+0

'.loads'需要一个字符串,但'urlopen'返回一个类似文件的对象。在这里使用'.load'是正确的。 – 2012-08-09 14:16:48

+0

他已经完成了'load'ing是的,但是为什么我们在'print json_object ['scans']''时再次看到''扫描''?然后他可以执行'json.loads(json.load(response))'或'print json.loads(json_object ['scans'])'来获得他实际可以遍历的字典。 – aneroid 2012-08-09 14:22:24

+1

啊,所以你认为'json_object ['scans']'是一个包含JSON的字符串......也许这似乎很奇怪。根据文档,它不:https://www.virustotal.com/documentation/public-api/#getting-file-scans – 2012-08-09 14:23:53

2
import json 
import urllib 
import urllib2 
url = "https://www.virustotal.com/vtapi/v2/file/report" 
parameters = {"resource": "2aa837802b1c7867a65067525a843566029bd97e3ce99f6eb55217e219043ae1", 
     "apikey": "12312312312312312"} 
data = urllib.urlencode(parameters) 
req = urllib2.Request(url, data) 
response = urllib2.urlopen(req) 
json_object = response.read() 
print '\n ' 
response_dict = json.loads(json_object) 
print response_dict.get("response_code",{}) 

这会输出对象中response_code的值。要使用嵌套值,可以完成response_dict.get("scans",{}).get("AVG",{}) 。谢谢大家!