Как напечатать список строк в dict в JSON - PullRequest
0 голосов
/ 07 марта 2020

Здравствуйте, я пытался напечатать список dll_loaded

"behavior": {
    "generic": [
        {
            "process_path": "C:\\Windows\\System32\\wscript.exe", 
            "summary": {
                "dll_loaded": [
                    "C:\\Windows\\system32\\wshext.dll", 
                    "C:\\Windows\\system32\\advapi32.dll", 
                ]
             }
         }

, но это всегда дает мне эту ошибку TypeError: string indices must be integers

Я пытался напечатать его, используя следующее

        for sys in json_data["behavior"]["generic"]:
            for sys1 in sys["summary"]:
                for sys2 in sys1["dll_loaded"]:
                    print(sys2)

Я пытался напечатать тип sys1, и он дает мне <class 'str'>, не должно ли быть список? затем попытался обработать sys1 как строку и распечатать, используя range и len, но он возвращал только символы один за другим!

но я не уверен, где я ошибаюсь, кто-то может помочь, пожалуйста? Я использую Python 3.7

РЕДАКТИРОВАТЬ
Я попытался ответить на вопрос John P, и это сработало, но теперь я столкнулся с другой проблемой, такой как dll_loaded не первый элемент в списке

"behavior": {
    "generic": [
        {
            "process_path": "C:\\Windows\\System32\\wscript.exe", 
            "summary": {
                "file_created": [
                    "C:\\Users\\Administrator\\AppData\\Roaming\\WinRAR\\version.dat"
                ], 
                "file_recreated": [
                    "\\Device\\DfsClient"
                ], 
                "directory_created": [
                    "C:\\Users\\Administrator\\AppData\\Roaming\\WinRAR"
                ], 
                "dll_loaded": [
                    "C:\\Windows\\system32\\wshext.dll", 
                    "C:\\Windows\\system32\\advapi32.dll", 
                ]
             }
         }

Извините, но я все еще новичок в Python

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Я думаю, что вы ищете что-то вроде этого:

for sys in json_data["behavior"]["generic"][0]["summary"]['dll_loaded']:
    print(sys)

Нет необходимости иметь 3 слоя для -l oop, так как вас интересует только список, сгенерированный из json_data["behavior"]["generic"][0]["summary"]['dll_loaded'].

Что касается вашей проблемы того, почему тип sys1 равен <class 'str'>, то это потому, что sys["summary"] дает словарь из одного элемента вместо списка. И при выполнении итераций по словарю в случае for sys1 in sys["summary"] sys1 ссылается на ключи в словаре, и в этом случае ссылается только на строку "dll_loaded".

Если вы настаиваете на том, чтобы иметь вложенные циклы for (не рекомендуется), правильно укажите, что-то вроде этого:

for sys in json_data["behavior"]["generic"]:
   for sys1 in sys["summary"]:
      for sys2 in sys["summary"][sys1]:
         print(sys2)
0 голосов
/ 07 марта 2020

Я думаю, вы просто неправильно прочитали структуру данных. Не было списка под "summary", поэтому у вас было слишком много циклов.

for sys in json_data["behavior"]["generic"]:
    for sys1 in sys["summary"].get("dll_loaded", []):
        print(sys1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...