Как разобрать сложный объект json в Azure Data Explorer - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть следующее свойство, которое мне нужно проанализировать как JSON.Я пытался использовать parse_json(), но он не работает

Запрос

AzureActivity
| where OperationNameValue == "Microsoft.Authorization/roleAssignments/write" 
| where ActivityStatus  == "Started"
| where (Properties contains "8e3af657-a8ff-443c-a75c-2fe8c4bcb635") or (Properties contains "b24988ac-6180-42a0-ab88-20f7382dd24c")
| extend request = parse_json(Properties)
| where request.requestbody.Properties.Scope == "/subscriptions/6f5c5be9-a2dd-49c9-bfa1-77d4db790171"

Необработанные данные, которые необходимо проанализировать

{"requestbody": "{\ "Id \": \ "992a2739-9bd2-4d04-bc5f-5ed1142b9861 \", \ "Свойства \": {\ "PrincipalId \": \ "5ac319a4-740b-4f09-9fd3-fce3ce91fedf \", \»RoleDefinitionId \ ": \" / подписки / 6f5c5be9-a2dd-49c9-bfa1-77d4db790171 / поставщиков / Microsoft.Authorization / roleDefinitions / 8e3af657-a8ff-443c-a75c-2fe8c4bcb635 \ "\ "Сфера \": \" / подписки /6f5c5be9-a2dd-49c9-bfa1-77d4db790171 \ "}}"}

1 Ответ

0 голосов
/ 18 февраля 2019

посмотрите внизу этой страницы (также цитируется ниже), что объясняет, почему следующие работы (кстати, обратите внимание, что я заменил contains на has для вас, с точки зрения эффективности):

AzureActivity
| where OperationNameValue == "Microsoft.Authorization/roleAssignments/write" 
| where ActivityStatus  == "Started"
| where (Properties has "8e3af657-a8ff-443c-a75c-2fe8c4bcb635") or (Properties has "b24988ac-6180-42a0-ab88-20f7382dd24c")
| extend request = parse_json(tostring(parse_json(Properties).requestbody))
| project request.Properties.Scope

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

Например: let d='{"a":123, "b":"{\\"c\\":456}"}'; print d

В таких случаях необходимо не только дважды вызвать parse_json, но и убедиться, что во втором вызове будет использоваться tostring.В противном случае второй вызов parse_json просто передаст вход на выход как есть, потому что его объявленный тип является динамическим:

let d='{"a":123, "b":"{\\"c\\":456}"}'; print d_b_c=parse_json(tostring(parse_json(d).b)).c

...