如何在Jsonnet中导入.yaml格式文件?
在Jsonnet中导入YAML文件的方法
嘿,这个问题我刚好折腾过!Jsonnet本身确实没有原生的import YAML文件的语法,但咱们有两种靠谱的方法能实现你想要的效果,一起来看看:
方法一:使用原生函数组合(推荐)
Jsonnet从0.17.0版本开始提供了std.parseYaml()函数,我们可以结合importstr()读取YAML文件的原始内容,再用这个函数把字符串解析成Jsonnet可操作的对象。
具体步骤很简单:
- 用
importstr()读取YAML文件的纯文本内容 - 用
std.parseYaml()解析字符串,注意它返回的是数组(因为YAML支持多文档),单文档场景取数组第一个元素即可 - 之后就可以像操作普通Jsonnet对象一样使用里面的字段了
举个完整的例子:
假设你的foo.yaml内容是:
bar: "Hello from YAML" baz: - item1 - item2
对应的Jsonnet代码:
// 读取YAML文件的原始字符串 local fooYamlStr = importstr "foo.yaml"; // 解析为Jsonnet对象(单文档取索引0) local foo = std.parseYaml(fooYamlStr)[0]; // 提取你需要的字段 local bar = foo.bar; // 测试输出 { extractedBar: bar, bazItems: foo.baz }
运行这个Jsonnet文件,就能得到和YAML结构对应的JSON输出啦。
方法二:预转YAML为JSON(适合静态场景)
如果你的Jsonnet版本比较老,或者不想用动态解析,也可以先用命令行工具(比如yq)把YAML文件转成JSON格式:
yq eval -o json foo.yaml > foo.json
之后直接用Jsonnet的原生import导入JSON文件就行:
local foo = import "foo.json"; local bar = foo.bar;
这种方法适合YAML内容不会频繁变动的场景,提前转成JSON可以避免运行时的解析开销。
这样就能完美实现你想要的导入YAML并使用其中字段的需求啦!
内容的提问来源于stack exchange,提问作者Aleš
相关产品推荐
相关产品推荐

