AttributeError: у объекта 'dict' нет атрибута 'imdata' - PullRequest
2 голосов
/ 02 мая 2020

Попытка извлечь некоторые поля из возвращенного JSON:

Event [{'subscriptionId': ['72059810266873859'], 'imdata': [{'fvAEPg': {'attributes': {'annotation': '', 'childAction': '', 'configIssues': '', 'configSt': 'applied', 'descr': '', 'dn': 'uni/tn-Student1/ap-AP_SD1/epg-er34', 'exceptionTag': '', 'extMngdBy': '', 'floodOnEncap': 'disabled', 'fwdCtrl': '', 'hasMcastSource': 'no', 'isAttrBasedEPg': 'no', 'isSharedSrvMsiteEPg': 'no', 'lcOwn': 'local', 'matchT': 'AtleastOne', 'modTs': '2020-05-01T22:31:30.293+01:00', 'monPolDn': 'uni/tn-common/monepg-default', 'name': 'er34', 'nameAlias': '', 'pcEnfPref': 'unenforced', 'pcTag': 'any', 'prefGrMemb': 'exclude', 'prio': 'unspecified', 'rn': '', 'scope': '3047425', 'shutdown': 'no', 'status': 'created', 'triggerSt': 'not_triggerable', 'txId': '6341068275364643083', 'uid': '15374'}}}]}]

, используя эту функцию, получая json и используя pyjq:

def printws():
    while True:
        message = pyjq.all((ws.recv()))
        print("Event", message)
        wbxt_api.messages.create(room_id, text=(message[0].imdata))

, сообщение печатается как указано выше, но я собираюсь получить только некоторые поля и получить эту ошибку:

Traceback (most recent call last):
  File "/usr/lib64/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/lib64/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "aci_teste_new161.py", line 180, in printws
    wbxt_api.messages.create(room_id, text=(message[0].imdata))
AttributeError: 'dict' object has no attribute 'imdata'

Это должно быть связано с попыткой доступа к значению dict, я довольно младший на python, и я не кажется, это работает ...

по-другому:

def printws():
    while True:
        print((ws.recv()(["imdata"][0]["fvAEPg"]["attributes"]["name"])))

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib64/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/lib64/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "aci_teste_new161.py", line 190, in printws
    print((ws.recv()(["imdata"][0]["fvAEPg"]["attributes"]["name"])))
TypeError: string indices must be integers

любая помощь?

1 Ответ

0 голосов
/ 02 мая 2020

Чтобы получить доступ к python данным словаря, выполните следующие действия:

message[0]["imdata"]

Редактировать

Чтобы получить неизвестные ключи в вашем словаре, вы можете сделать это,

imdata = message[0]['imdata'][0]
imdata_keys = list(imdata.keys())

Это даст вам список ключей в вашем словаре. В ваших imdata есть только один ключ, поэтому он вернет вас:

['fvAEPg']

Теперь, если вы хотите получить доступ к fvAEPg -> attributes -> dn, вы можете выполнить следующую процедуру:

imdata[imdata_keys[0]]['attributes']['dn']

Счастливая кодировка;)

...