【问题标题】:How to replace string for each item in a list in jsonnet?如何替换jsonnet列表中每个项目的字符串?
【发布时间】: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 起可用”注释。

标签: json append jsonnet


【解决方案1】:

在这种特殊情况下,因为要替换的字符串只有一个字符,所以您可以在本地实现该函数:

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"

【讨论】:

    最近更新 更多