在kusto查询中解析json

nam*_*ata 3 azure

如何使用KUSTO查询从JSON中提取单个值.

我希望能够读取SourceSystemId,Message的值并投影这些值.我还想在以下JSON中使用date作为过滤器.并且仅投影日期大于作为外部参数提供的日期的记录.

{{
  "Status": 2,
  "SourceSystemId": "4",
  "RequisitionId": null,
  "Errors": [
    {
      "Code": "8002",
      "Message": "some message",
      "FieldName": "VendorNumber",
      "PartNumber": null
    },
    {
      "Code": "8003",
      "Message": "",
      "FieldName": "PartNumber",
      "PartNumber": ""
    }
  ],
  "SuppName": "SomeSupp",
 "Date":"22/2/2017"
}}
Run Code Online (Sandbox Code Playgroud)

Yon*_*i L 9

假设您有一个名为的表T,其中一个列名为MyString,它存储您的JSON值并键入为string(下面为此示例定义了一个表).

  1. 您首先需要parse_json()在列上调用(除非它已经输入,dynamic而不是,因为string在这种情况下,您可以跳过此步骤).
  2. 然后,您可以使用DateJSON值访问该属性,并使用todatetime()它将其强制转换为type datetime.
  3. 之后,您可以按外部参数进行过滤(dateTimeLowerBound在下面的示例中).
  4. 最后-你可以project你的相关性兴趣(Message在第一单元Errors阵列,以及SourceSystemId),你可以将它们转换成预期的类型(如longstring使用tolong(),并tostring()分别).

这是一个例子:

let dateTimeLowerBound = datetime(2017-01-21);
let T = datatable(MyString:string) // this table is just for the example
[
'{"Status": 2, "SourceSystemId": "4", "RequisitionId": null, "Errors": [ { "Code": "8002", "Message": "some message", "FieldName": "VendorNumber", "PartNumber": null }, { "Code": "8003", "Message": "", "FieldName": "PartNumber", "PartNumber": "" } ], "SuppName": "SomeSupp", "Date":"2017-02-22"}'
];
T 
| project MyJson = parse_json(MyString)
| where todatetime(MyJson.Date) > dateTimeLowerBound
| project SourceSystemId = tolong(MyJson.SourceSystemId), Message = tostring(MyJson.Errors[0].Message)
Run Code Online (Sandbox Code Playgroud)

本实施例的输出应为表2列,命名SourceSystemIdMessage,的类型longstring,并用这些值4some message分别.