Windows批处理 - 每个脚本的漂亮打印JSON

时间:2015-10-14 06:47:16

标签: json batch-file command-line scripting

我在服务器上有多个JSON文件,只能运行批处理脚本或命令行工具。所有JSON文件都没有正确格式化,这意味着行的开头没有制表符空格。

有没有办法,编写批处理脚本或运行命令行工具来格式化文件,这样它们又恢复正常了吗?

4 个答案:

答案 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,因此建议不要创建批处理脚本!我强烈建议您使用命令行工具。默认情况下,它会美化。

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)

本着 dnaficationpython-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::XSRead this for details