【发布时间】:2025-12-12 00:55:02
【问题描述】:
如何替换 jsonnet 中列表中的值。像这样的基本示例似乎不起作用:
local users = import "../data/users.json";
// replace dots in username
local users_new = [
u + { replaced_username: std.strReplace(u.username, ".", "_") }
for u in users
];
{
data: {
[user.replaced_username]: {
username: user.username,
} for user in users_new
}
}
错误信息是这样的:
RUNTIME ERROR: Field does not exist: strReplace
templates/users.jsonnet:5:32-45 object <anonymous>
templates/users.jsonnet:11:17-38 thunk <b>
std.jsonnet:148:27 thunk <vals>
std.jsonnet:611:21-24
std.jsonnet:611:12-25 thunk <a>
std.jsonnet:611:12-36 function <anonymous>
std.jsonnet:611:12-36 function <anonymous>
std.jsonnet:148:13-28 function <anonymous>
templates/users.jsonnet:11:10-38 object <anonymous>
During manifestation
据我从错误消息中了解到,我不能在键中使用计算值,或者我在这里遗漏了什么?
UPD:原来std.strReplace 函数在 jsonnet 版本 0.9.5 中不存在。通过将该函数复制到模板中解决了问题。
【问题讨论】:
-
你能告诉我你用的是什么版本的jsonnet吗?
std.strReplace函数是最近添加的,jsonnet.org 上的文档会跟踪当前的 master。最可能的解释是您使用的 jsonnet 版本还没有此功能。否则代码看起来应该可以工作。 -
顺便说一句
["%s" % user.replaced_username]似乎毫无意义,为什么不直接使用[user.replace_username]. -
@sbarzowski 我通过自制软件安装它,
jsonnet -v Jsonnet commandline interpreter v0.9.5。 -
@sbarzowski 谢谢!你的回答很有帮助。我可以将
std.strReplace函数从源代码复制到同一个模板中,并且效果很好。我想知道是否有办法查看哪些功能可用?期待使用更简洁代码的下一个版本。 -
> 我想知道是否有办法查看哪些功能可用?是的:
jsonnet -e "std.objectFieldsAll(std)"BTW 我认为有计划为下一个版本之后添加的功能添加“自版本 X 起可用”注释。