概述
JMES是一个增强型的JSON查询计算语言, 不仅可以用于对JSON数据进行抽取, 还可以做计算与转换。关于JMES的语法详细介绍可以参考JMES Tutorial。
数据加工中的json_select函数和e_json函数支持以JMES语法对(字段或表达式表示JSON的)值提取或计算特定值。其用法为
json_select(字段, "jmes表达式", default=None, restrict=False)
e_json(字段, jmes="jmes表达式", ...)
关于这两个函数的具体用法,可参考json_select函数和e_json函数。
本文介绍JMES常用语法。
通过key来获取值
原始日志
"json_data":{
"a": "foo",
"b": "bar",
"c": "baz"
}
jmes语法
json_select(v("json_data"), "a") #返回值 foo
json_select(v("json_data"), "b") #返回值 bar
json_select(v("json_data"), "c") # 返回值 baz
通过层级访问来获取值
原始日志
"json_data":{"a":
{"b":
{"c":
{"d":"value"}
}
}
}
jmes语法
json_select(v("json_data"), "a.b.c.d") # 返回值 value
通过索引来获取值
通过索引访问主要用于json中的数组数据
原始日志
"json_data":{
"a": ["b", "c", "d", "e", "f"]
}
jmes语法
json_select(v("json_data"), "a[2]") # 返回值 d
通过切片操作获取值
对于json中的数组数据还可以使用切片操作
原始日志
"json_data":{
"a": ["b", "c", "d", "e", "f"]
}
jmes语法
json_select(v("json_data"), "a[2: ]") # 返回值 ["d", "e", "f"]
多种用法综合使用
原始日志
"json_data":{
"a": {
"b": {
"c": [{"d": [0, [1, 2]]}, {"d": [3, 4]}]
}
}
}
jmes语法
json_select(v("json_data"), "a.b.c[0].d[1][0]") # 返回值 1
通过投影来获取值
原始日志1
"json_data":{
"people": [
{"first": "James", "last": "d"},
{"first": "Jacob", "last": "e"},
{"first": "Jayden", "last": "f"},
{"missing": "different"}
],
"foo": {"bar": "baz"}
}
jmes语法
json_select(v("json_data"), "people[*].first") # 返回值 ["James","Jacob","Jayden"]
原始日志2
"json_data":{
"ops": {
"functionA": {"numArgs": 2},
"functionB": {"numArgs": 3},
"functionC": {"variadic": true}
}
}
jmes语法
json_select(v("json_data"), "ops.*.numArgs") # 返回值 [2, 3]
原始日志3
"json_data":{
"machines": [
{"name": "a", "state": "running"},
{"name": "b", "state": "stopped"},
{"name": "c", "state": "running"}
]
}
jmes语法
json_select(v("json_data"), "machines[?state=='running'].name") # 返回值 ["a", "c"]
多值选取
原始日志
"json_data":{
"people": [
{
"name": "a",
"state": {"name": "up"}
},
{
"name": "b",
"state": {"name": "down"}
}
]
}
jmes语法
json_select(v("json_data"), "people[].[name, state.name]") # 返回值[["a","up"],["b","down"]]
计算数组长度
对于json中的数组数据,jmes语法支持数组长度的计算
原始日志
"json_data":{
"a": ["b", "c", "d", "e", "f"]
}
jmes语法
json_select(v("json_data"), "length(a)") # 返回值 5
# length(a) > 0, 设置"no-empty"字段为true
e_if(json_select(v("json_data"), "length(a)", default=0), e_set("no-empty", true))
更多关于JMES的语法参考JMES Tutorial。
进一步参考
欢迎扫码加入官方钉钉群获得实时更新与阿里云工程师的及时直接的支持: