如何使用单行python命令解析json?

Chr*_*now 8 python json

我想使用python解析批处理脚本中的JSON,例如:

HOSTNAME=$(curl -s ${HOST} | python ?)
Run Code Online (Sandbox Code Playgroud)

curl的JSON输出如下所示:

'{"hostname":"test","domainname":"example.com"}'
Run Code Online (Sandbox Code Playgroud)

如何使用单行python命令执行此操作?

小智 10

echo '{"hostname":"test","domainname":"example.com"}' | python -m json.tool
Run Code Online (Sandbox Code Playgroud)

  • 这只会漂亮地打印传入的 json。没有提取变量或数组成员。 (5认同)

Chr*_*now 8

基于以下从curl命令返回的JSON ...

'{"hostname":"test","domainname":"example.com"}'
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用python通过json json模块提取主机名:

HOSTNAME=$(curl -s ${HOST} | python -c \
    'import json,sys;print json.load(sys.stdin)["hostname"]')
Run Code Online (Sandbox Code Playgroud)

请注意,我已经使用a拆分了该行,\以使其在stackoverflow上更具可读性。我还根据chepner的注释简化了该命令。

原始资料:使用Unix工具解析JSON

另请参阅:https : //wiki.python.org/moin/Powerful%20Python%20One-Liners

  • 对于 python3:`python3 -c '导入 json,sys; 打印(json.load(sys.stdin)[“主机名”])'`。相同的东西,但带有用于打印的括号 (2认同)

mul*_*g0r 6

由于 Python 是多平台的,因此注意 Linux 和 Windows 之间的差异非常重要,特别是因为它们处理双引号/单引号的方式不同。

其次,之前的一些答案有点过时:在 python2 中,print允许不带括号。然而,在 python3 中,print 必须位于括号之间。

Linux(bash)

如何放置双/单引号并不重要。Json可以用“keys”或“keys”两种方式解析

HOSTNAME=$(curl -s "$HOST" |
  python3 -c 'import json,sys;print(json.load(sys.stdin)["hostname"])')
Run Code Online (Sandbox Code Playgroud)

它也有效:(注意键处的单/双引号

HOSTNAME=$(curl -s "$HOST" |
  python3 -c "import json,sys;print(json.load(sys.stdin)['hostname'])")
Run Code Online (Sandbox Code Playgroud)

Windows(电源外壳)

json 中的键必须位于单引号之间。仅接受以下语法。
ConvertTo-Json函数生成对象并使用单引号之间的键。

$HOSTNAME=(Invoke-RestMethod $HOST | `
  ConvertTo-Json | `
  python3 -c "import json,sys; print(json.load(sys.stdin)['hostname'])")
Run Code Online (Sandbox Code Playgroud)