Как мне импортировать файл JSON с повторяющимися ключами в фрейм данных? - PullRequest
0 голосов
/ 05 мая 2020

Например: у меня есть программа, которая генерирует такие журналы использования в файле JSON. Файл журнала JSON содержит много одного и того же ключа, называемого «активность», например, следующего:

  "probe": "PROCESS_PROBE",
  "status": "ProcessCreated",
  "processName": "backgroundTaskHost.exe",
  "path": "C:\\WINDOWS\\system32\\backgroundTaskHost.exe",
  "creationClassName": "Win32_Process",
  "handle": "21632",
  "priority": "Normal",
  "commandLine": "\"C:\\WINDOWS\\system32\\backgroundTaskHost.exe\" -ServerName:CortanaUI.AppXy7vb4pc2dr3kc93kfc509b1d0arkfb2x.mca",
  "handleCount": 236,
  "processId": 21632,
  "parentProcessId": 112,
  "pageFileUsage": 4244,
  "creationDate": "20200410172922.614702+120",
  "annotations": {
    "userName": "datta",
    "timeSinceStartup": 259878750,
    "ticksOfEvent": 637221365629757593
  }
},
"activity":{
  "probe": "PROCESS_PROBE",
  "status": "ProcessDeleted",
  "processName": "RuntimeBroker.exe",
  "path": "C:\\Windows\\System32\\RuntimeBroker.exe",
  "creationClassName": "Win32_Process",
  "handle": "8504",
  "priority": "Normal",
  "handleCount": 285,
  "processId": 8504,
  "parentProcessId": 112,
  "pageFileUsage": 3180,
  "creationDate": "20200410172757.934567+120",
  "terminationDate": null,
  "annotations": {
    "userName": "datta",
    "timeSinceStartup": 259883953,
    "ticksOfEvent": 637221365681937472
  }
},
"activity":{
  "probe": "FILERESOURCE_PROBE",
  "status": "Changed",
  "path": "C:\\Users\\datta\\eclipse\\jee-2019-12",
  "entityName": "eclipse",
  "extension": "",
  "attributes": "Directory",
  "owner": "null",
  "length": 0,
  "isReadOnly": false,
  "creationTime": "2020-01-17T09:42:08.5092897+01:00",
  "lastWriteTime": "2020-03-25T10:56:10.7382329+01:00",
  "lastAccessTime": "2020-04-10T17:29:29.9811767+02:00",
  "annotations": {
    "userName": "datta",
    "timeSinceStartup": 259885750,
    "ticksOfEvent": 637221365699837331
  }
},
"activity":{
  "probe": "FILERESOURCE_PROBE",
  "status": "Changed",
  "path": "C:\\Users\\datta\\eclipse",
  "entityName": "jee-2019-12",
  "extension": "",
  "attributes": "Directory",
  "owner": "null",
  "length": 0,
  "isReadOnly": false,
  "creationTime": "2020-01-17T09:42:08.5083+01:00",
  "lastWriteTime": "2020-01-17T09:42:08.5092897+01:00",
  "lastAccessTime": "2020-04-10T17:29:29.9801436+02:00",
  "annotations": {
    "userName": "datta",
    "timeSinceStartup": 259885750,
    "ticksOfEvent": 637221365699906960
  }
},
"activity":{
  "probe": "FILERESOURCE_PROBE",
  "status": "Changed",
  "path": "C:\\Users\\datta",
  "entityName": "eclipse",
  "extension": "",
  "attributes": "Directory",
  "owner": "null",
  "length": 0,
  "isReadOnly": false,
  "creationTime": "2020-01-17T09:42:08.5083+01:00",
  "lastWriteTime": "2020-01-17T09:42:08.5083+01:00",
  "lastAccessTime": "2020-04-10T17:29:29.9922013+02:00",
  "annotations": {
    "userName": "datta",
    "timeSinceStartup": 259885765,
    "ticksOfEvent": 637221365699922013
  }
}
}

Я хотел бы загрузить данные внутри ключей активности в виде столбцов фрейма данных. Например, каждое действие будет строкой во фрейме данных, а столбцы - «зонд», «статус», «имя процесса» и т. Д. c.

Проблема в том, что когда я загружаю данные с использованием logData = json.load(logfile), загружается только последний ключ активности, поскольку он перезаписывается из-за дублирования. Я попытался загрузить данные, используя logData = json.load(logfile, object_pairs_hook=tuple). Он загружает данные в виде огромного кортежа. Я не уверен, как получить фрейм данных, который я пытаюсь получить. Заранее спасибо.

1 Ответ

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

См. Допускает ли синтаксис JSON дублирование ключей в объекте?

Проблема здесь не в JSON, а в структуре назначения, которую вы используете. Модуль json Pythons определяет импорт объекта JSON в словари, что делает невозможной обработку повторяющихся свойств (ключей).

Настоящая проблема здесь заключается в производителе этого JSON. Было бы очень легко составить список записей или даже список словарей ("activity" - единственный ключ в каждом). По своим собственным причинам производитель решил создать эту структуру, которая является (почти) законной, но не может быть обработана большинством JSON потребителей (я знаю Python, PHP и, что наиболее важно, JavaScript, все бы наткнулись на это).

Также вполне безопасно предположить, что программа, генерирующая файл, который вы пытаетесь прочитать, не сгенерировала его через пакет JSON (по крайней мере, не весь файл) . Вероятно, он генерирует фрагменты текста и добавляет их в поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...