2017-05-26 15 views
2

Ich habe unter Abfrage in einer Variablen gespeichert habe ich und ich muss Wert von 'Ressource_Status' abrufen.Parsen von JSON in Python

Ich brauche 'UPDATE_IN_PROGRESS'

Wie gewünscht, hier den Code setzen. Die Variable evntsdata speichert die Ereignisliste.

try: 
    evntsdata = str(hc.events.list(stack_name)[0]).split(" ") # this is the variable that is getting the JSON response (or so) 

    #print(evntsdata[715:733]) 
    #event_handle = evntsdata[715:733] 

    if event_handle == 'UPDATE_IN_PROGRESS': 
     loopcontinue = True 
     while loopcontinue: 
      evntsdata = str(hc.events.list(stack_name)[0]).split(" ") 
      #event_handle = evntsdata[715:733] 
      if (event_handle == 'UPDATE_COMPLETE'): 
       loopcontinue = False 
       print(str(timestamp()) + " " + "Stack Update is Completed!" + ' - ' + evntsdata[-3] + ' = ' + evntsdata[-1]) 
      else: 
       print(str(timestamp()) + " " + "Stack Update in Progress!" + ' - ' + evntsdata[-3] + ' = ' + evntsdata[-1]) 
       time.sleep(10) 
    else: 
     print("No updates to perform") 
     exit(0) 

except AttributeError as e: 
    print(str(timestamp()) + " " + "ERROR: Stack Update Failure") 
    raise 

print (evntsdata) hat unten Ergebnis

['<Event', "{'resource_name':", "'Stackstack1',", "'event_time':", "'2017-05-26T12:10:43',", "'links':", "[{'href':", "'x',", "'rel':", "'self'},", "{'href':", "'x',", "'rel':", "'resource'},", "{'href':", "'x',", "'rel':", "'stack'}],", "'logical_resource_id':", "'Stackstack1',", "'resource_status':", "'UPDATE_IN_PROGRESS',", "'resource_status_reason':", "'Stack", 'UPDATE', "started',", "'physical_resource_id':", "'xxx',", "'id':", "'xxx'}>"] 
+3

Dies ist nicht JSON. Sie haben anscheinend ein Ereignisobjekt gedruckt. Bitte * zeigen Sie Ihren Code * mit einem [Bearbeiten] und schließen Sie auch Ihre Versuche ein, diese –

+0

zu analysieren. Bitte überprüfen Sie die Änderung. Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen –

+2

Was auch immer 'hc.events.list (stack_name) [0]' ist, sollten Sie 'str()' und '.split()' es nicht. Das ist auf so vielen Ebenen falsch. Ich nehme an, dass diese 'Event' Klasse einige Methoden hat, um das gesuchte Feld zu erhalten. Benutze sie. – freakish

Antwort

1

Sie Objekte nicht serialisiert und analysieren, wenn die Daten vor Ihnen ist. Dies ist ineffizient und schwer zu verstehen und zu pflegen. Die Lösung ist ziemlich trivial:

data = hc.events.list(stack_name)[0].to_dict() 
event_handle = data['resource_status'] 
+0

Das hat tatsächlich funktioniert :) Danke sooo viel –

0

Es ist nicht JSON, it's a class that you've printed

class Event(base.Resource): 
    def __repr__(self): 
     return "<Event %s>" % self._info 

Versuchen um den Quellcode Stossen Zugang zum Wörterbuchself._info, dann zu bekommen Greifen Sie auf Ihre Felder gemäß

zu

Zum Beispiel

event_info = hc.events.list(stack_name)[0]._info 
event_handle = event_info['resource_status'] 

Obwohl, kann es eine andere Art und Weise sein, wie to_dict() stattdessen aufrufen, da der Unterstrich eine private Variable gibt

+0

Das einzige, was ich nicht tun würde, ist '_info' (was ein privates Objekt vorschlägt). Eigentlich hat diese 'Event' Klasse eine richtige' to_dict() 'Methode. – freakish

+0

Ich habe mich nicht die Basisklasse angesehen –

+0

Das ist so schwierig. Dieser GitHub-Link hat den eigentlichen Code, aber ich wollte wirklich nicht so weit gehen. Ich möchte nur den Ressourcenstatus. https://github.com/openstack/python-heatclient/blob/master/heatclient/v1/events.py. –