如何替换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:原来在jsonnet 0.9.5版中没有std.strReplace
函数。通过将该功能复制到模板中解决了问题。
答案 0 :(得分:2)
在这种特殊情况下,因为要替换的字符串只有一个字符,所以可以在本地实现该函数:
local strReplace(str, a, b) = (
assert std.length(a) == 1;
std.join(b, std.split(str, a))
);
strReplace(strReplace("hello world", "o", "0"), "l", "1")
以上示例给出了以下输出:
$ jsonnet -version
Jsonnet commandline interpreter v0.9.5
$ jsonnet strReplace.jsonnet
"he110 w0r1d"