Unix命令行JSON解析器?[关闭]


128

谁能推荐一个Unix(选择您的口味)JSON解析器,该解析器可用于检查管道中JSON响应中的值?


我喜欢使用pythonpy(github.com/russell91/pythonpy):cat a.json | PY --jI -x 'x.attr'
RussellStewart



1
城镇中有一个新工具:ramda-cli,它使用Ramda的curried api和LiveScript简洁语法。它被构造为将json作为输入和组成函数。npm install -g ramda-cli
Ehvince 2015年

Answers:


18

您可以使用Perl核心内置的模块使用此命令行解析器(如果愿意,可以将其放入bash别名):

perl -MData::Dumper -MJSON::PP=from_json -ne'print Dumper(from_json($_))'

1
我对此的输出感到困惑。输出包括键和值之间的粗箭头(=>)。这不是JSON。
Landon Kuhn '02

7
@landon:不,输入是JSON,输出是本机Perl数据结构,然后可以根据需要继续进行操作。这种单行代码的要点是它会产生易于阅读的数据。
以太

1
如果需要JSON输出,则可以使用以下Perl单行代码:perl -e "use JSON; print to_json( decode_json(<>), { pretty => 1 } )"
Georgy Vladimirov

232

我更喜欢python -m json.tool默认情况下大多数* nix操作系统上默认情况下都可以使用的版本。

$ echo '{"foo":1, "bar":2}' | python -m json.tool
{
    "bar": 2, 
    "foo": 1
}

但是应该注意,这将按字母顺序对所有键进行排序,这在使用某种无序HashMaps语言生成json的情况下是一件好事,或者可能是一件好事...


5
被低估的答案。如果目标是验证给定的JSON文件是否包含有效JSON,则这是一种不错的命令行替代方法。
scorpiodawg 2012年

10
这个答案没有描述如何检查指定键的值。
科林·苏

8
@ColinSu,但这也不是最初的问题。json.tool只是漂亮打印json的捷径。如果您需要在shell脚本中提取/处理json数据,我会使用jq它在执行时确实很棒……
muhqu 2014年

@muhqu是的,我知道,我json.tool每天使用十次。我想我误解了问题中“内省”的含义,感谢您的指出。
科林·苏

1
恕我直言,这是一个错误的答案,因为python json.tool仅做两件事:validate和pretty-print json。它不会像jq这样自省json中的值。
Devy

144

如果您正在寻找可移植的C编译工具:

http://stedolan.github.com/jq/

从网站:

jq就像sed一样用于JSON数据-您可以使用sed来像sedawkgrep一样轻松地对结构化数据进行切片,过滤,映射和转换和friends可以让您处理文本。

jq可以毫不费力地将您拥有的数据格式转换为所需的数据格式,并且这样做的程序通常比您期望的更短,更简单。

教程http//stedolan.github.com/jq/tutorial/
手册http//stedolan.github.com/jq/manual/
下载http//stedolan.github.com/jq/download/


20
最好的答案在这里。无需繁琐的依赖,小巧,功能强大的文档,并且轻而易举地进行尝试。非常感谢您提出的建议!
FrozenCow

在Ubuntu / Debian上,您可以apt install jq
Pablo A

我是在一个多月前问的,已经学会了爱jq
JE队列

63

我创建了一个专门为命令行JSON操作设计的模块:

https://github.com/ddopson/underscore-cli

  • 灵活 -用于处理JSON数据的“瑞士军刀”工具-可以用作简单的漂亮打印机,也可以用作功能强大的Javascript命令行
  • 强大 -展现underscore.js的全部功能和功能(加上underscore.string)
  • 简单 -使编写JS单行代码变得简单,类似于使用“ perl -pe”
  • 陷入困境 -多个命令invokations可以链接起来,以创建数据处理管道
  • 多格式对输入/输出格式的丰富支持-漂亮的打印,严格的JSON等[即将推出]
  • 已记录 -出色的命令行文档,每个命令都有多个示例

它可以让您真正轻松地完成功能强大的事情:

cat earthporn.json | underscore select '.data .title'
# [ 'Fjaðrárgljúfur canyon, Iceland [OC] [683x1024]',
#   'New town, Edinburgh, Scotland [4320 x 3240]',
#   'Sunrise in Bryce Canyon, UT [1120x700] [OC]',
# ...
#   'Kariega Game Reserve, South Africa [3584x2688]',
#   'Valle de la Luna, Chile [OS] [1024x683]',
#   'Frosted trees after a snowstorm in Laax, Switzerland [OC] [1072x712]' ]

cat earthporn.json | underscore select '.data .title' | underscore count
# 25

underscore map --data '[1, 2, 3, 4]' 'value+1'
# prints: [ 2, 3, 4, 5 ]

underscore map --data '{"a": [1, 4], "b": [2, 8]}' '_.max(value)'
# [ 4, 8 ]

echo '{"foo":1, "bar":2}' | underscore map -q 'console.log("key = ", key)'
# key = foo
# key = bar

underscore pluck --data "[{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}]" name
# [ 'moe', 'larry', 'curly' ]

underscore keys --data '{name : "larry", age : 50}'
# [ 'name', 'age' ]

underscore reduce --data '[1, 2, 3, 4]' 'total+value'
# 10

它具有可用的最佳“智能空白” JSON格式器之一:

如果您有任何功能要求,请对此帖子发表评论或在github中添加一个问题。我很高兴优先考虑社区成员所需的功能。


太棒了!但是,是否可以对JSON数据运行控制台命令?例如:给定一个带有URL数组的JSON文件,wget每个URL。
卡米洛·马丁

@CamiloMartin-最简单的方法是打印出URL,每行一个URL,然后通过xargs或GNU parallel运行它。
Dave Dopson

我可以使用@DaveDopson underscore解析具有嵌套对象和数组的嵌套json吗?
user227666

1
@ user227666-当然。JSON支持嵌套许多级别的对象。或者,您可能会说JSON具有一个字符串,该字符串可对其他JSON进行编码。这也可以,但是只需要一点点调整。
Dave Dopson 2014年

@DaveDopson下划线是否支持“包含”“模式”,即。对于特定的“键”,可能的一组(不区分大小写)值?我尝试将“ jq”与火柴配对,但无法正常工作。这里还张贴了我完整的用例- stackoverflow.com/questions/25463196/...
的Ekta

13

结帐TickTick

这是一个真正的Bash JSON解析器。

#!/bin/bash
. /path/to/ticktick.sh

# File
DATA=`cat data.json`
# cURL
#DATA=`curl http://foobar3000.com/echo/request.json`

tickParse "$DATA"

echo ``pathname``
echo ``headers["user-agent"]``

爱是爱壳级工具:)
JE队列

12

还有JSON命令行处理工具包如果您碰巧在堆栈中有node.js和npm,那么。

还有另一个用于在Unix命令行上按摩JSON的“ json”命令

以下是其他替代方法:


相关:用于Unix解析JSON输入的命令行工具?


易于安装,在Ubuntu上:sudo apt-get install python-pip && sudo pip install jsonpipe
activout.se 2012年

@ divideandconquer.se抱歉,但是您使用带有npm的npm安装了此工具npm install json
gitaarik 2014年

@rednaw不幸的是,现在NPM软件包json似乎已由另一个完全不同的软件包接管。
布拉德(Brad)2014年

8

有人提到Jshon或JSON.sh吗?

https://github.com/keenerd/jshon

将json传递给它,然后遍历json对象,并打印出当前对象(作为JSON数组)的路径,然后打印出该对象的路径,没有空格。

http://kmkeen.com/jshon/
Jshon从stdin加载json文本,执行操作,然后在stdout上显示最后一个操作,这也成为了常规文本处理管道的一部分。


在OSX上的用法示例:brew install jshoncat *.json | jshon
kenorb


1

对于Bash / Python,这是python的基本包装simplejson

json_parser() {
    local jsonfile="my_json_file.json"
    local tc="import simplejson,sys; myjsonstr=sys.stdin.read(); "`
            `"myjson=simplejson.loads(myjsonstr);"
    # Build python print command based on $@
    local printcmd="print myjson"
    for (( argn=1; argn<=$#; argn++ )); do
        printcmd="$printcmd['${!argn}']"
    done
    local result=$(python -c "$tc $printcmd.keys()" <$jsonfile 2>/dev/null \
        || python -c "$tc $printcmd" <$jsonfile 2>/dev/null)
    # For returning space-separated values
    echo $result|sed -e "s/[]|[|,|']//g"
    #echo $result 
}

它实际上仅处理数据的嵌套字典样式,但是它可以满足我的需要,并且对于遍历json很有用。它可能适合口味。

无论如何,对于那些不想从另一个外部依赖中获取资源的人来说,这是他们自己种的。当然,除了python。

例如 json_parser {field1} {field2}将运行print myjson['{field1}']['{field2}'],产生键或与关联的值(以{field2}空格分隔)。


0

我刚刚制作了jkid,这是一个小型命令行json资源管理器,我可以通过它轻松地浏览大型json对象。可以“横向”浏览对象,并使用“预览”选项来避免控制台溢出。

$  echo '{"john":{"size":20, "eyes":"green"}, "bob":{"size":30, "eyes":"brown"}}' > test3.json
$  jkid . eyes test3.json 
object[.]["eyes"]
{
  "bob": "brown", 
  "john": "green"
}

如何jkid在Mac中安装?
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.