【问题标题】:How to print outer JSON attribute on each line with the inner ones?如何在每一行上打印外部 JSON 属性和内部属性?
【发布时间】:2015-03-13 14:15:25
【问题描述】:

我有这样的 JSON:

{
  "files": [
    { "size": 3227238, "name": "file1.mp3" },
    { "size": 3737995, "name": "file2.mp3" }
  ],
  "id": "music"
}

我想在单独的行上打印每个文件,但包括外部元素的 id。

file1.mp3 music
file2.mp3 music

我可以像这样获取文件属性:

jq -r '.files | .[] | .name'

但是如何在每一行包含 id 呢?

【问题讨论】:

    标签: json jq


    【解决方案1】:

    你可以使用这个过滤器:

    "\(.files[].name) \(.id)"
    

    这将为每个包含名称和外部 id 的文件生成一个字符串。

    您可能希望获得原始输出,所以不要忘记-r 标志。

    如果您想从每个文件中提取的不仅仅是名称,则需要对过滤器进行调整。关键是在过滤器的任何部分中最多使用一次.[]。根据您希望字符串中每个部分的位置,您可以采用多种方法。

    如果它们都在你的字符串的一部分中,你可以添加另一个字符串来组合你想要的属性:

    "\(.files[] | "\(.name) \(.size)") \(.id)"
    

    否则,引入变量会更容易:

    .id as $id | .files[] | "\(.name) \($id) \(.size)"
    

    【讨论】:

    • 在单个过滤器中使用多个.[] 时要小心,您将得到所有可能值的叉积。如果您需要每个文件的更多属性,则必须调整过滤器。
    • 错误:语法错误,意外'(',期待$end (.files[].md5) (.id) [指向第二个'(']
    • 你的命令行是什么样的?反斜杠可能会混淆外壳。对过滤器使用单引号。例如,jq -r '"\(.files[].name) \(.id)"'
    • 知道了!谢谢杰夫:)
    • 如果我想得到名称和大小,有没有办法扩展过滤器,或者只是\(.files[].name) \(.files[].size)
    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多