如何使用jq进行漂亮打印,以便多个值在同一行?

时间:2017-10-18 08:29:08

标签: json formatting jq pretty-print

我从jq获得的是:

{
  "frameGrid": {
    "size": [
      24,
      24
    ],
    "dimensions": [
      1,
      1
    ],
    "names": [
      [
        "default"
      ]
    ]
  }
}

我希望看到更像是这样的东西:

{
  "frameGrid": {
    "size": [24,24], 
    "dimensions": [1,1],
    "names": [["default"]]
  }
}

我知道这两种形式都有效,并且jq具有紧凑/漂亮的打印模式。但是介于两者之间吗?我想以某种方式格式化一个更大的json文件,该文件具有比这更多的数组值,因此它易于阅读和打印。也许我只是使用错误的工具来完成这项工作?

(请原谅可怕的格式化选择。似乎代码样本不太喜欢json格式)

3 个答案:

答案 0 :(得分:3)

虽然最好使用类似peak建议的工具,如果你的json不是太复杂,你可以使用第二个jq调用来后处理第一个的输出。例如,如果您的数据位于data.json

$ jq -M . data.json | jq -MRsr 'gsub("\n      +";"")|gsub("\n    ]";"]")'

产生

{
  "frameGrid": {
    "size": [24,24],
    "dimensions": [1,1],
    "names": [["default"]]
  }
}

答案 1 :(得分:2)

正如@ jq170727所提到的,jq(例如jq .)的漂亮打印运行后的后处理值得考虑。在这方面,这是一个awk脚本,可能就足够了:

#!/bin/bash

awk '
  function ltrim(x) { sub(/^[ \t]*/, "", x); return x; }
  s && NF > 1 && $NF == "["  { s=s $0;               next}
  s && NF == 1 && $1 == "]," { print s "],";   s=""; next}
  s && NF == 1 && $1 == "["  { print s;        s=$0; next}
  s && NF == 1 && $1 == "{"  { print s; print; s=""; next}
  s && NF == 1 && $1 == "]"  { print s $1;     s=""; next}
  s && NF == 1 && $1 == "}"  { print s;        s=$0; next}
  s                          { s=s ltrim($0);        next}
  $NF == "["                 { s=$0;                 next}
  {print}
'

实施例

使用示例输入,调用:

 jq . example.json | ./pp

产生

{
  "frameGrid": {
    "size": [24,24],
    "dimensions": [1,1],
    "names": [
      ["default"]
    ]
  }
}

调用:

jq -n '{a:[1,2,3,[1,2,3,4]],b:2,c:{d:[1,2,{e:[3,4]}]}}' | ./pp

产生

{
  "a": [1,2,3,
    [1,2,3,4]
  ],
  "b": 2,
  "c": {
    "d": [1,2,
      {
        "e": [3,4]
      }
    ]
  }
}

答案 2 :(得分:0)

如果您还没有结婚,请看看FracturedJson。有一个基于Web的格式化程序,一个命令行应用程序和几个库。

FracturedJson内联数组/对象,只要它们既不太长也不太复杂(根据您的设置)。如果它们不太复杂,它也可以作为多行数组,每行包含多个项。否则,它将以经典的缩进形式出现。

以下是使用默认设置的原始问题的数据:

{
    "frameGrid": {
        "size": [24, 24],
        "dimensions": [1, 1],
        "names": [ ["default"] ]
    }
}

披露:我是FracturedJson的作者。它是根据MIT许可开放的。