评估前将 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
,但 expression
和 result
字段交换了(我 认为 这是你的意图)
输入 (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 解析器可能会干扰其他语言表达式
给定以下 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
,但 expression
和 result
字段交换了(我 认为 这是你的意图)
输入 (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 解析器可能会干扰其他语言表达式