评估前将 jsonnet 表达式转换为字符串

jsonnet expression to string before evaluation

给定以下 jsonnetfile:

{
  expression: self.result,
  result: 3 > 1,
}

计算结果为:

{
   "expression": true,
   "result": true
}

有没有办法在评估前将表达式转换为字符串?期望的结果如下:

{
   "expression": "3 > 1",
   "result": true
}

由于jsonnet不支持eval()- alike 表达式,只有的方法实际上是加载这样的文件作为带有[=15=的文本](然后方便地将其解析为 YAML¹),还使用 ​​import() 将其解析为 jsonnet,然后将两个对象“合并”到 cherry-pick每个字段。

下面是上述的一种可能的方法,当然,它可以推广到更“复杂”的根对象结构,但足以说明该方法。

请注意,您原来的 jsonnetfile 保存为 foo.yaml,但 expressionresult 字段交换了(我 认为 这是你的意图)

输入 (foo.yaml)

{
  expression: 3 > 1,  
  result: self.expression,
}

代码

local asYAML = std.parseYaml(importstr 'foo.yaml');
local asJsonnet = import 'foo.yaml';

{
  expression: asYAML.expression,
  result: asJsonnet.result,
}

输出

{
   "expression": "3 > 1",
   "result": true
}

¹ 请注意,将 jsonnet 加载为 YAML 将仅支持 jsonnet 的一个子集,因为 YAML 解析器可能会干扰其他语言表达式