情境一:展開和提取JSON對象
日誌中包含JSON對象時,您可以通過parse-json和json_extract_scalar 或者json_extract函數展開和提取對象。
樣本1:展開一層JSON
例如,展開data欄位值中的第一層索引值對。
原始日誌
data: {"k1": "v1", "k2": {"k3": "v3", "k4": "v4"}}spl 語句
* | parse-json data加工結果
data: {"k1": "v1", "k2": {"k3": "v3", "k4": "v4"}} k1: v1 k2: {"k3": "v3", "k4": "v4"}
樣本2:完全展開JSON對象
例如,完全展開data欄位值中的各層索引值對。
原始日誌
data: {"k1": "v1", "k2": {"k3": "v3", "k4": "v4"}}spl 語句
* | parse-json data | extend k3 = json_extract_scalar(k2, '$.k3'), k4 = json_extract_scalar(k2, '$.k4') | project k1, k3, k4,data加工結果
data:{"k1": "v1", "k2": {"k3": "v3", "k4": "v4"}} k1:v1 k3:v3 k4:v4
樣本3:指定欄位名精確提取JSON對象值
指定JSON對象中的鍵名,精確提取目標索引值對。
原始日誌
data: { "foo": { "bar": "baz" }, "peoples": [{ "name": "xh", "sex": "girl" }, { "name": "xm", "sex": "boy" }] }spl 語句
* | extend name = json_extract_scalar(data, '$.peoples[0].name'), bar = json_extract_scalar(data, '$.foo.bar'), foo_obj = json_extract(data, '$.foo')加工結果
data:{"foo": {"bar": "baz"}, "peoples": [{"name": "xh", "sex": "girl"}, {"name": "xm", "sex": "boy"}]} foo:{"bar": "baz"} bar:baz name:xh names:["xh", "xm"]
情境二:提取JSON對象值
日誌中包含JSON對象時,您可以通過json_extract_scalar函數提取JSON對象值。
樣本1:JSON對象包含目標欄位
例如,提取JSON對象中的索引值對"k1":"v1",並將鍵名更改為key1。
原始日誌
data: {"k1":"v1","k2":"v2"}spl 語句
* | extend key1 = json_extract_scalar(data, '$.k1')加工結果
data:{"k1": "v1", "k2": "v2"} key1:v1
樣本2:JSON對象不包含目標欄位
例如,提取JSON對象中的索引值對,當目標鍵不存在時,新增一個鍵key3,並使用預設值為其賦值。
原始日誌
data: {"k1":"v1","k2":"v2"}spl 語句
* | extend key3 = coalesce(json_extract_scalar(data, '$.k3'), 'default')加工結果
data:{"k1": "v1", "k2": "v2"} key3:default
情境三:更新JSON對象值
日誌中包含JSON對象時,您可以通過replace函數更新JSON對象值。
例如,修改JSON對象中k1的值。
原始日誌
data: {"k1":"v1","k2":"v2"}spl 語句
* | extend data = replace(data, '"k1":"v1"', '"k1":"new_k1"')加工結果
data:{"k1": "new_k1", "k2": "v2"}
情境四、將值解析為JSON對象
您可以使用json_parse函數將字串解析為JSON對象。
例如,data欄位值為字串,您可以將其轉換為JSON對象。
原始日誌
data: "pre{ \"k1\": \"v1\", \"k2\": \"v2\"}"spl 語句
* | extend json_object = replace(data, 'pre', '') | extend json_object=json_parse(json_object)加工結果
data:pre{ "k1": "v1", "k2": "v2"} json_object:{"k1": "v1", "k2": "v2"}