【发布时间】:2021-10-01 18:37:42
【问题描述】:
是否有一些公认的使用 bash 和 jq 生成 JSON 文档的“最佳实践”?我有一个脚本来收集各种数据,并使用其他工具更容易进一步处理我想以 JSON 格式输出数据。所以我使用 jq 来确保所有引用等都正确完成,正如这个答案中所建议的那样:https://stackoverflow.com/a/48470227/75652。但是,我正在努力解决如何生成它而不是最后生成一个巨大的 jq 调用。例如。像
read foo <<<$(</path/to/some/oneliner/file)
jq -n --arg f $foo '{foo: $f}'
bar=$(some_command)
jq -n --arg b $bar '{bar: $b}'
将生成两个单独的对象(可以使用支持各种或多或少的非正式“JSON 流”格式的工具处理,包括 jq)而我想要一个对象,例如
{ "foo": SOMETHING, "bar": SOMETHING_ELSE }
但我不能通过多个 jq 调用来做到这一点,因为 jq 会抱怨不完整的 JSON 格式错误。
为了进一步增加一些复杂性,在某些情况下我需要生成嵌套的 JSON 结构。在像 python 这样的另一种语言中,我只是将所有数据放在一组嵌套字典中,然后最后将其转储到 JSON,但是 bash 中的嵌套字典似乎非常乏味..
【问题讨论】:
-
为了进一步增加一些复杂性,在某些情况下我需要生成嵌套的 JSON 结构。有什么例子?
-
jq -n --arg f "$foo" --arg b "$bar" '{foo: $f, bar: $b}'? -
“最后一点而不是一个巨大的呼叫”通常会适得其反。您调用的外部流程越不同,您在启动这些流程时消耗的开销就越多。更有效地减少它们的数量,或者 - 理想情况下 - 只有一个。
-
(在 bash 中嵌入 awk 也是如此:如果您可以将整个循环移动到 awk 中,而不是让 bash 每次通过循环时单独调用 awk,那就是 大大更快,通常是几个数量级;对于 jq 也是如此)。
-
@janneb 他所指的错误不是在您的
jq调用中引用$foo和$bar的扩展。正确方法见我之前的评论。