Ballerina是否支持类XML导航的JSON嵌套键访问方式?
在Ballerina中访问JSON任意嵌套层级的指定键
在Ballerina中,没有像XML的/**/<name>那样的原生简洁选择器语法,但可以通过两种方式实现任意嵌套层级下指定键的访问,其中第二种方式的语义和XML写法高度一致:
- 方式一:自定义递归函数遍历
通过递归遍历JSON的所有层级,收集目标键对应的值,适用于所有Ballerina版本:
import ballerina/io; public function main() { json data = { "level1": { "target": "value1", "level2": { "target": "value2", "level3": {"target": "value3"} } }, "target": "value0" }; json[] results = collectNestedValues(data, "target"); io:println(results); // 输出 [value0, value1, value2, value3] } function collectNestedValues(json j, string key) returns json[] { json[] values = []; if j is record {|...|} { if key in j { values.push(j[key]); } foreach var [k, v] in j.entries() { values = values.concat(collectNestedValues(v, key)); } } else if j is json[] { foreach json item in j { values = values.concat(collectNestedValues(item, key)); } } return values; }
- 方式二:使用
json:query模块的递归查询语法
Ballerina 2201.4.0及以上版本支持json:query模块,其中$..<key>语法和XML的/**/<name>语义完全一致,可直接匹配任意嵌套层级的指定键:
import ballerina/io; import ballerina/json; public function main() { json data = { "level1": { "target": "value1", "level2": { "target": "value2", "level3": {"target": "value3"} } }, "target": "value0" }; json result = check json:query(data, "$..target"); io:println(result); // 输出 ["value0","value1","value2","value3"] }
注:
$..target中的$代表根JSON对象,..表示递归遍历所有后代节点,最终匹配所有名为target的键。
内容的提问来源于stack exchange,提问作者Prakanth
相关产品推荐
相关产品推荐

