2012-08-09 94 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",{}) 。謝謝大家!