Я пытаюсь работать с файлом json, который был добавлен в Data Explorer в виде таблицы с двумя столбцами: FileLineContent и LineNumber (есть еще два, но они не интересны для моих целей). Я использую Kusto для получения содержимого файла и манипулирования им. Таблица выглядит следующим образом:
LineNumber FileLineContent
1 [
2 {
3 "atr1": "value11",
4 "atr2": "value12",
5 "atr3": {
6 atr31": "value131",
7 atr32": "value132"
8 },
9 "atr4": {
10 "atr41": {
11 "atr411": [
12 "value14111",
13 "value14112"
14 ]
15 }
16 }
17 },
18 {
19 "atr1": "value21",
20 "atr2": "value22",
21 "atr3": {
22 atr31": "value231",
23 atr32": "value232"
24 },
25 "atr4": {
26 "atr41": {
27 "atr411": [
28 "value24111",
29 "value24112"
30 ]
31 }
32 }
33 }
34 ]
Подведем итог: у нас есть массив json-элементов с глубокой иерархией (до 5), отформатированных «красиво» для человеческого глаза, а не для глаз кусто. Мне нужно работать с этими элементами и отображать несколько значений для нескольких атрибутов. Мне трудно создать необработанную переменную, которую я мог бы проанализировать как json.
Я попытался вручную создать json с аналогичной структурой и заметил, что мне нужно удалить все пробелы и все кавычки внутри фигурных скобок. Это должно выглядеть так:
let json = '{"atr1":"value11","atr2":"value12","atr3":"{\\"atr31\\":\\"value131\\",\\"atr32\\":\\"value132\\",\\"atr33\\":\\"value133\\",\\"atr34\\":\\"value134\\",\\"atr35\\":\\"value135\\"}"}';
тогда я могу использовать parse_json()
для отображения значений атрибутов.
print parse_json(tostring(parse_json(json).atr3)).atr31
Но это, конечно, не массив json. Я просто построил его, чтобы посмотреть, как его ожидает Kusto.
В заключение моя проблема: как я могу преобразовать приведенную выше таблицу во что-то, что я мог бы проанализировать как JSON? Я попробовал некоторые функции агрегирования, но ничего не дало удовлетворительного результата.
Спасибо!
Это то, что я использовал для решения проблемы. Добавляю сюда, вдруг кому-то понадобится. Запрос предполагает, что данные хранятся в JsonTable в формате, описанном выше:
let RawDataFromTable =
['JsonTable']
| order by LineNumber asc
| summarize raw = strcat_array(make_list(FileLineContent), "\r\n") by FileName;
RawDataFromTable
| project json = parse_json(tostring(raw))
| mv-expand json
| evaluate bag_unpack(json)
| evaluate bag_unpack(atr3,'atr3_') //this line expands the attributes under atr3 under different columns called atr3_atr31, atr3_atr32.
Затем запрос можно изменить на основе необходимых данных.