我从jq获得的是:
{
"frameGrid": {
"size": [
24,
24
],
"dimensions": [
1,
1
],
"names": [
[
"default"
]
]
}
}
我希望看到更像是这样的东西:
{
"frameGrid": {
"size": [24,24],
"dimensions": [1,1],
"names": [["default"]]
}
}
我知道这两种形式都有效,并且jq具有紧凑/漂亮的打印模式。但是介于两者之间吗?我想以某种方式格式化一个更大的json文件,该文件具有比这更多的数组值,因此它易于阅读和打印。也许我只是使用错误的工具来完成这项工作?
(请原谅可怕的格式化选择。似乎代码样本不太喜欢json格式)
答案 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许可开放的。