Jsonnet结合字符串格式化与拼接报错,如何实现高可读性字符串构建?
问题与解决
问题描述
想要构建可读性更高、便于后续添加新变量的字符串表达式,编写了如下Jsonnet代码:
std.format('{%s}', std.join(', ', [ std.format('"account": "%s"', dev_account_id), std.format('"service": "%s"', business_service), std.format('"dir": "%s"', kms_module_dir) ]) )
运行时触发报错:
app_metaflow/shore/main.pipeline.jsonnet:(58:19)-(72:8)\tobject <anonymous> During manifestation " RUNTIME ERROR: Missing argument: vals /mnt/data/jenkins/workspace/d-platform_fusmltrn-app_metaflow/shore/main.pipeline.jsonnet:63:9-35 thunk from <thunk from <thunk from <object <anonymous>>>> /mnt/data/jenkins/workspace/d-platform_fusmltrn-app_metaflow/shore/main.pipeline.jsonnet:(59:9)-(71:11) thunk from <object <anonymous>> <std>:769:20-24 thunk from <function <anonymous>> <std>:32:25-26 thunk from <function <anonymous>> <std>:32:16-27 function <anonymous> <std>:769:8-25 function <anonymous>
目标是生成与以下语句等效的字符串,但实现方式更具可读性:
std.format('{"account": "%s", "service": "%s", "dir": "%s"}', [dev_account_id, business_service, kms_module_dir])
错误原因
Jsonnet的std.format函数要求第二个参数必须是数组类型的参数列表,你在内部的std.format调用中直接传入了单个变量(如dev_account_id),而非数组,导致函数识别不到必填的vals参数,触发报错。
修正方案
方案1:修正内部std.format的参数传递
把每个内部std.format的变量参数放到数组中,修改后的代码如下:
std.format('{%s}', std.join(', ', [ std.format('"account": "%s"', [dev_account_id]), std.format('"service": "%s"', [business_service]), std.format('"dir": "%s"', [kms_module_dir]) ]) )
注:可以把"替换为直接的双引号",Jsonnet中支持字符串内用双引号(只要整个字符串用单引号包裹),可读性会更好。
方案2:更优雅的实现(推荐)
直接构建JSON对象,再用std.json函数转换为字符串,这种方式完全避免手动拼接格式,扩展性和可读性都更强,后续加新字段只需在对象中添加键值对即可:
std.json({ account: dev_account_id, service: business_service, dir: kms_module_dir })
这段代码会生成和目标语句完全等效的JSON字符串,且维护成本更低。
内容的提问来源于stack exchange,提问作者Riley Hun
相关产品推荐
相关产品推荐

