2016-04-25 12 views
0

ich diese Methode in einer Datenklasse habe:Wert kann nicht von Python dict bekommen

def submit_request(self, method, path, body=None, header=None): 
    conn = httplib.HTTPSConnection(self.host) 
    conn.request(method, path, body, self.headers) 
    resp = conn.getresponse() 
    return resp.status, resp.read() 

die ich Antworten von jeder Anfrage zu greifen verwenden. Für die aktuelle Antwort, mit der ich arbeite, kann ich keine spezifischen Werte abrufen.

Normalerweise würde ich

status, resp = submit_request("GET", "/path/to/...", body) 
info = json.loads(resp) 
value = info["value"] 

gehen und ich würde eingestellt werden, dass entsprechenden Wert aus dem dict zu verwenden. Aber wie ich unten zeigen werde, kann ich das für diesen Fall nicht tun.

>>> print resp 
[{"deviceId":28,"displayName":"test-device","status":"Pending_Authorized"}] 

wenn ich kopieren und PASE diese Antwort kann ich

tun
>>> resp[0]['deviceId'] 
28 

aber im Code tun nicht funktioniert (ich nur [ von resp[0]). Ich bekomme immer

TypeError: string indices must be integers, not str 

Jeder Hinweis darauf, warum dies geschieht?

Hier ist der entsprechende Code:

def test_get_device_list(self): 
    ''' 
    GET /Device/List 
    ''' 
    status_code, resp = self.api.submit_request("GET", "/Device/List") 
    log.log_info("GET /Device/List: HTTP - %s" % str(status_code)) 
    log.log_info("GET /Device/List: Response - %s" % str(resp)) 
    self.assertEqual(status_code, 200) 

    #GET /Device/{DeviceID} 
    device_id = self.api.parse_header(resp, "deviceId") 
    status_get, resp_get = self.api.submit_request("GET", "/Device/%s" % str(device_id)) 
    log.log_info("GET /Device/{DeviceID}: HTTP - %s" % str(status_get)) 
    log.log_info("GET /Device/{DeviceID}: Response - %s" % str(resp_get)) 
    self.assertEqual(status_get, 200) 

und von der Stützdatenklasse

def submit_request(self, method, path, body=None, header=None): 
    conn = httplib.HTTPSConnection(self.host) 
    conn.request(method, path, body, self.headers) 
    resp = conn.getresponse() 
    return resp.status, resp.read() 

def parse_header(self, resp, arg): 
    info = json.loads(resp) 
    parse = info["%s" % str(arg)] 
    return parse 

Hier sind die vollständigen Fehler:

ERROR: test_get_device_list (__main__.TestAPI) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "API.py", line 207, in test_get_device_list 
    device_id = self.api.parse_header(str(resp), "deviceId") 
    File "/home/zach/Desktop/Automation/data.py", line 47, in parse_header 
    parse = info["%s" % str(arg)] 
TypeError: list indices must be integers, not str 

ich einen Weg zu finden, bin versucht zu Holen Sie die obige "deviceId" aus der Antwort. Ich habe es mit verschiedenen Antworten mit der Methode parse_header() gemacht, aber für diese Antwort funktioniert es nicht.

+0

Sie laden das Antwortobjekt - das ein Array mit einem einzelnen Objekt zu sein scheint - in die Variable 'info' und versuchen dann, auf die Eigenschaft" value "dieses Arrays zuzugreifen. Arrays haben keine "Value" -Eigenschaften. – Hamms

+0

Also ... warum hast du 'json.loads' nicht auf deinem' resp' String verwendet? – user2357112

+0

@ user2357112 Ich bekomme den gleichen TypeError – user3239567

Antwort

0

Sie versuchen hier mit einer Zeichenfolge auf Ihre Liste zuzugreifen. Haben Sie versucht, auf das erste Element zuzugreifen, um zu Ihrem Wörterbuch zu gelangen, bevor Sie den Schlüssel aufrufen?

+0

Ahh gibt, sehe ich. Vielen Dank! – user3239567

+0

Sie wetten, g'luck mit Ihrem Projekt! –

Verwandte Themen