我正在尝试使用一个 json 文件,该文件作为一个包含两列的表引入到数据资源管理器中:FileLineContent 和 LineNumber(还有 2 列,但对于我的目的来说它们并不有趣)。我使用 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 个),其格式对于人眼来说是“很好的方式”,但对于 kusto 的眼睛来说却不太好。 我需要使用这些元素并显示多个属性的多个值。我很难构建可以解析为 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.
然后可以根据需要的数据修改查询。