Jsonnet技术问题:如何移除数组外层括号直接使用元素
如何移除Jsonnet数组的外层括号?
问题背景
你编写的带条件逻辑的Jsonnet脚本,当前条件判断返回的是数组,但你需要去掉外层括号,直接得到逗号分隔的元素列表,不想通过索引调用(效率低、扩展性差)。
核心说明
Jsonnet要求最终输出必须是合法的Jsonnet/JSON值(数组、对象、字符串等),直接输出无括号的元素列表不属于合法值范畴,无法直接返回这种结构。但可以根据实际使用场景,用以下两种方式实现需求:
方案1:数组展开(嵌入到其他结构时使用)
如果你的目标是把这些元素嵌入到另一个数组或对象的字段中,使用Jsonnet的**数组展开运算符...**即可,无需手动处理索引,扩展性强。
修改后的示例代码:
local test123 = [ { foo_1: "bar_1", foo_2: "bar_1", }, { foo_1: "bar_10", foo_2: "bar_20", }, { foo_1: "bar_100", foo_2: "bar_30", }, ]; local test = 3; // 将条件返回的数组元素展开到新数组中 [ ...(if test >= 1 then test123 else []) ]
若要嵌入到对象字段中:
{ items: [ ...(if test >= 1 then test123 else []) ] }
方案2:生成字符串片段(需要纯文本输出时使用)
如果确实需要生成无外层括号的元素字符串片段,可以用std.map将每个对象转为格式化字符串,再用std.join拼接成目标格式。
修改后的示例代码:
local test123 = [ { foo_1: "bar_1", foo_2: "bar_1", }, { foo_1: "bar_10", foo_2: "bar_20", }, { foo_1: "bar_100", foo_2: "bar_30", }, ]; local test = 3; // 将元素转为格式化字符串并拼接 std.join(",\n ", std.map(function(item) std.prettyJson(item), if test >= 1 then test123 else []))
输出结果(字符串形式):
{ "foo_1": "bar_1", "foo_2": "bar_1" }, { "foo_1": "bar_10", "foo_2": "bar_20" }, { "foo_1": "bar_100", "foo_2": "bar_30" }
内容的提问来源于stack exchange,提问作者Aladine
相关产品推荐
相关产品推荐

