首页 > 解决方案 > Azure 数据资源管理器将动态列中的 guid 字符串转换为小写

问题描述

如果我将 json 对象写入数据类型为动态的列,则与 guid 格式匹配的字段将自动转换为小写。

如果我解析一个字符串,extractjson我会得到大写的 guid:

print('{"guid":"6F77A167-8B36-49BB-8846-497B7F1BE1BF"}')
| extend guid = extractjson("$.guid", print_0)

// result: 6F77A167-8B36-49BB-8846-497B7F1BE1BF

但如果使用动态类型或parse_json转换为小写,则发生:

print('{"guid":"6F77A167-8B36-49BB-8846-497B7F1BE1BF"}')
| extend guid = parse_json(print_0)

// result: {"guid":"6f77a167-8b36-49bb-8846-497b7f1be1bf"}

print('{"guid":"6F77A167-8B36-49BB-8846-497B7F1BE1BF"}')
| extend guid = todynamic(print_0)

// result: {"guid":"6f77a167-8b36-49bb-8846-497b7f1be1bf"}

有人可以告诉我这是否是预期的行为吗?从我的角度来看,默认情况下不需要将 guid 转换为小写,保持区分大小写是否有缺点?

在我的情况下,所使用的系统依赖于区分大小写的数据(我知道这不是好的设计)并且不能改变这个短期。

有没有办法在 ADX 中使用 json 对象(不仅是单个字段值),而无需将所有 guid 转换为小写?

谢谢!

标签: azureazure-data-explorer

解决方案


对于任何好奇的人,我认为问题在于任何动态转换函数中的返回类型extractjson和 guid 之间的差异。

IE

let test = '{"guid":"6F77A167-8B36-49BB-8846-497B7F1BE1BF"}';
let testDirect = dynamic({"guid":"6F77A167-8B36-49BB-8846-497B7F1BE1BF"});
print castDynamic=gettype(todynamic(test)["guid"]), gettype(Parse=parse_json(test)["guid"]), ToObject=gettype(toobject(test)["guid"]), Direct=gettype(testDirect["guid"])

将显示所有可能的转换方式都会导致“guid”的类型为 guid。但随着

let test2 = '{"guid":"6F77A167-8B36-49BB-8846-497B7F1BE1BF"}';
print gettype(extractjson("$.guid", test2))

的返回类型extractjson是一个字符串。实际上,忽略动态,仅接收具有 guid 值的字符串并将其强制转换为 guid 将导致它“小写字符串”(只是有点因为结果不是字符串而是 guid)。

let test3 = "6F77A167-8B36-49BB-8846-497B7F1BE1BF";
print toguid(test3)

由于没有(我知道)强制 todynamic 选择类型的好方法,我不相信强制大写行为是可能的。我能看到的最好的选择是通过将值转换为字符串并自己将其大写来追溯处理它,或者以某种方式欺骗 todynamic 不将值转换为 guid(即在 guid 中附加一个值,如字符串)。


推荐阅读