json - 如何替换 jsonnet 列表中每个项目的字符串?

标签 json append jsonnet

如何替换 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 函数。通过将该函数复制到模板中解决了问题。

最佳答案

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

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"

关于json - 如何替换 jsonnet 列表中每个项目的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49011412/

相关文章:

python - 无法从 json 响应中解析 streetAddresses

mysql - Spring Boot中将所有mysql表数据转换为JSON

file - 在 VBScript 中每次 append 到文件而不是覆盖文件

ios - ios中如何解析多个json?

javascript - 使用下拉 JavaScript 无法进入输入文本字段

jsonnet - 如何在jsonnet中附加现有对象?

jsonnet - 使用 jsonnet 更新现有数组元素

go - jsonnet 中的自定义内置函数

python - 将变量的结果 append 到列表

python - 通过将三个列表的元素添加在一起来创建新列表 - 关联错误(PYTHON)