如何在KQL中从JSON结构里的字符串数组提取首个元素?
问题分析与解决
存储的JSON结构
你的列中存储的JSON数据实际格式如下:
{"Attributes": "[\"AnAttribute\"]", "WorkItems": "[\"674746\"]", "AuthorAliases": "[\"AnAlias\"]" }
你尝试的查询语句
let t = datatable (data:string) [ @'{"Attributes": "[\"AnAttribute\"]","WorkItems": "[\"674746\"]","AuthorAliases": "[\"AnAlias\"]"}' ]; t | extend asDyn = todynamic(data) | extend WorkItems = asDyn["WorkItems"] | extend WorkItem = WorkItems[0]
执行结果
| data | asDyn | WorkItems | WorkItem |
|---|---|---|---|
| {"Attributes": "["AnAttribute"]","WorkItems": "["674746"]","AuthorAliases": "["AnAlias"]"} | {"Attributes": "["AnAttribute"]", "WorkItems": "["674746"]", "AuthorAliases": "["AnAlias"]"} | ["674746"] |
问题出在哪
你误解了JSON字段的实际类型:WorkItems这类字段的值不是数组,是被双引号包裹的字符串。虽然外观像数组,但经过todynamic(data)解析后,它依然是字符串类型,自然无法通过[0]语法获取数组元素(KQL中对字符串使用该语法不会返回有效内容)。
正确的查询方法
需要先把WorkItems对应的字符串再次用todynamic()转换为真正的动态数组,之后再提取首个元素:
let t = datatable (data:string) [ @'{"Attributes": "[\"AnAttribute\"]","WorkItems": "[\"674746\"]","AuthorAliases": "[\"AnAlias\"]"}' ]; t | extend asDyn = todynamic(data) | extend WorkItemsStr = asDyn["WorkItems"] | extend WorkItemsArr = todynamic(WorkItemsStr) | extend WorkItem = WorkItemsArr[0]
正确执行结果
| data | asDyn | WorkItemsStr | WorkItemsArr | WorkItem |
|---|---|---|---|---|
| {"Attributes": "["AnAttribute"]","WorkItems": "["674746"]","AuthorAliases": "["AnAlias"]"} | {"Attributes": "["AnAttribute"]", "WorkItems": "["674746"]", "AuthorAliases": "["AnAlias"]"} | ["674746"] | ["674746"] | 674746 |
内容的提问来源于stack exchange,提问作者Anders Sewerin Johansen
相关产品推荐
相关产品推荐

