我在服务器上有多个JSON文件,只能运行批处理脚本或命令行工具。所有JSON文件都没有正确格式化,这意味着行的开头没有制表符空格。
有没有办法,编写批处理脚本或运行命令行工具来格式化文件,这样它们又恢复正常了吗?
答案 0 :(得分:8)
你肯定需要一个外部工具。我正在使用command-line JSON processor jq
- 只需将其传递给一个空滤镜,它就会打印出它作为输入的JSON。
示例:
ECHO "{ \"att1\": 1, \"att2\": 2 }" | jq ""
输出:
{
"att1": 1,
"att2": 2
}
答案 1 :(得分:2)
如果安装了python,可以通过在命令提示符或powershell中键入以下内容来快速执行此操作:
type dirty.json | python -m json.tool > pretty.json
其中 dirty.json 是缩小或不可读的json, pretty.json 非常简单。你甚至可以把它放在一个批处理文件中,通过传递一个参数来运行它。它的处理速度非常快。
<强>说明:强>
type是将文件内容写入控制台,但是它是管道,因此它被发送到python的模块json.tool然后&#39;&gt;&#39;将输出写入名为&#39; pretty.json&#39;的文件中。尝试不使用> pretty.json
来查看控制台中的输出。
答案 2 :(得分:0)
Windows的cmd
功能非常有限,并且肯定不支持JSON,因此建议不要创建批处理脚本!我强烈建议您使用命令行工具xidel。默认情况下,它会美化。
Stdin:
ECHO {"a":1,"b":2,"c":3} | xidel -s - -e "$json"
{
"a": 1,
"b": 2,
"c": 3
}
(如果输入为JSON,则xidel
会解析并将其分配给(内部)全局变量$json
)
文件/网址:
xidel -s "input.json" -e "$json"
xidel -s "https://[...]" -e "$json"
写入文件:
xidel -s "input.json" -e "$json" > output.json
处理多个文件:
FOR %A IN (*.json) DO @xidel -s %A -e "$json" > %~nA_pretty.json
虽然此方法适用于目录中的许多JSON文件,但它也 非常 很慢,因为每个xidel
都会被调用,文件。
xidel
和集成的EXPath File Module可以更有效地做到这一点。
xidel -se "file:list(.,false,'json')"
这将返回当前目录中所有JSON文件的裸露列表。
(相当于DIR *.json /B
和FOR %A IN (*.json) DO @ECHO %A
)
xidel -se "file:list(.,false,'json') ! file:read-text(.)"
xidel -se "for $x in file:list(.,false,'json') return file:read-text($x)"
这两个命令都返回当前目录中每个JSON文件的内容。
(相当于FOR %A IN (*.json) DO @TYPE %A
)
xidel -se "file:list(.,false,'json') ! json(file:read-text(.))"
xidel -se "for $x in file:list(.,false,'json') return json(file:read-text($x))"
这两个命令都返回当前目录中每个JSON文件的经过解析的JSON内容。
(相当于FOR %A IN (*.json) DO @xidel -s %A -e "$json"
,但是 好很多 更快!)
xidel -se "file:list(.,false,'json') ! file:write(substring-before(.,'.json')||'_pretty.json',serialize-json(json(file:read-text(.)),{'indent':true}))"
xidel -se "for $x in file:list(.,false,'json') return file:write(substring-before($x,'.json')||'_pretty.json',serialize-json(json(file:read-text($x)),{'indent':true}))"
两个命令都将当前目录中每个JSON文件的经过解析的JSON内容写入文件名以“ _pretty”结尾的新文件中。
(serialize-json()
需要先将(美化的)JSON序列化/字符串化,然后再写入文件)
最后的命令美化了
xidel -se "
for $x in file:list(.,false,'json') return
file:write(
substring-before($x,'.json')||'_pretty.json',
serialize-json(
json(file:read-text($x)),
{'indent':true}
)
)
"
答案 3 :(得分:0)
本着 dnafication 的 python
-based answer 精神 - 如果您有 perl
,您可以:
TYPE dirt.json | perl -MJSON -0ne "print JSON->new->pretty->encode(decode_json $_)"
这适用于任何比 5.14(2011-05-14 发布)更新的 perl
,因为 JSON::PP
从那时起就是核心模块。请注意,这是一个纯 perl 实现,它的性能不如例如JSON::XS
。 Read this for details。