2017-05-26 95 views
2

我有下面的查詢存儲在我得到的變量中,我需要獲取'resource_status'的值。解析Python中的JSON

我需要 'UPDATE_IN_PROGRESS'

按照要求,把代碼在這裏。變量evntsdata正在存儲事件列表。

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 

打印(evntsdata)具有以下結果

['<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

這不是JSON。看起來你已經打印了一些Event對象。請*用[編輯]顯示您的代碼,並且還包括解析此 –

+0

時的嘗試,請檢查編輯。讓我知道如果你需要任何其他信息 –

+2

無論'hc.events.list(stack_name)[0]'你不應該'str()'和'.split()'它。這在很多層面上都是錯誤的。我假設這個'Event'類有一些方法來檢索你正在尋找的字段。使用它們。 – freakish

回答

1

不要序列,當數據在你面前解析對象。這是低效的,難以理解和維護。解決方案很瑣碎:

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

這實際上工作:)謝謝sooo –

0

這不是JSON,it's a class that you've printed

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

試着在源代碼戳來獲得訪問字典self._info,然後訪問您的字段根據

例如,

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

雖然,有可能像調用to_dict()而不是另一種方式,因爲下劃線表示私有變量

+0

我不會做的唯一的事情是使用'_info'(這表明它的私人對象)。實際上這個'Event'類有一個合適的'to_dict()'方法。 – freakish

+0

我沒有打擾基類 –

+0

這太棘手了。這個github鏈接有這個實際的代碼,但我真的不想去那麼遠。我只想要資源狀態。 https://github.com/openstack/python-heatclient/blob/master/heatclient/v1/events.py。 –