2010-10-04 167 views
109

任何人都可以推薦一個Unix(選擇你的味道)JSON解析器,可用於內部管道中的JSON響應的值?Unix命令行JSON解析器?

+0

我喜歡使用pythonpy(https://github.com/russell91/pythonpy):cat a.json | py --ji -x'x.attr' – RussellStewart 2014-09-14 20:25:06

+0

相關:[用於解析Unix的JSON輸入的命令行工具?](http://softwarerecs.stackexchange.com/q/19018/3474)at SR – kenorb 2015-04-25 10:32:01

+0

另請參見[Read在shell腳本中的json數據](http://stackoverflow.com/questions/20488315/read-the-json-data-in-shell-script) – koppor 2015-10-18 13:31:21

回答

13

首先,安裝來自CPAN的JSON模塊:

cpan JSON 

然後你可以使用此命令行解析器(其中,如果你喜歡,你可以放入一個bash別名):

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

我很困惑這個輸出。輸出包括鍵和值之間的胖箭頭(=>)。這不是JSON。 – 2012-02-18 18:34:04

+6

@landon:不,輸入是JSON,輸出是本地Perl數據結構,如果需要,您可以繼續操作。這個單線的重點在於它產生的數據更容易閱讀。 – Ether 2012-04-19 20:12:46

1

您可以嘗試jsawk,建議在this answer

真的,你可以掀起一個快速的Python腳本來做到這一點,雖然。

+0

有趣的,將退房。 – Xailor 2010-10-04 20:27:47

10
+0

在Ubuntu上安裝簡單:sudo apt-get install python-pip && sudo pip install jsonpipe – 2012-05-22 11:51:40

+0

@ divideandconquer.se對不起,您可以使用帶npm install json的npm安裝此工具。 – rednaw 2014-01-26 15:13:03

+0

@rednaw不幸的是,NPM包'json'現在似乎被完全不同的包所接管。 – Brad 2014-09-11 18:30:24

11

結帳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"]`` 
+0

需要shell級別的工具:) – Xailor 2012-02-22 22:01:52

8

任何人提到Jshon或JSON.sh?

https://github.com/keenerd/jshon

管JSON來,然後將其穿過JSON對象,並打印出該路徑到當前對象(作爲一個JSON陣列),然後將對象,不空格。

http://kmkeen.com/jshon/
Jshon負荷從標準輸入JSON文本,執行操作,然後顯示在標準輸出上的最後一個動作,也有人是普通的文本處理流水線的一部分。

+0

OSX上的例子:'brew install jshon','cat * .json | jshon' – kenorb 2014-08-29 09:58:31

60

我已經創建專門針對命令行JSON操作設計的模塊:

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

  • FLEXIBLE - 用於處理JSON數據 「瑞士-軍隊刀」 工具 - 可以使用作爲一個簡單的漂亮打印機,或作爲一個全功能的JavaScript命令行
  • 強大 - 公開underscore.js的全部功能和功能(加上underscore.string)
  • SIMPLE - 簡化了寫JS單行類似於使用 「的perl -pe」
  • CHAINED - 多個命令invokations可以鏈接在一起,以創建一個數據處理管線
  • MULTI- FORMAT - 用於輸入/輸出格式富支持 - 漂亮印刷,嚴格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上添加一個問題。我很樂意優先考慮社區成員需要的功能。

+0

太棒了!但是,可以在JSON數據上運行控制檯命令嗎?例如:給一個帶有URL數組的JSON文件,每個URL使用'wget'。 – 2013-09-27 11:44:37

+0

@CamiloMartin - 最簡單的方法是打印出URL,每行一個URL,然後通過xargs或GNU parallel執行。 – 2013-09-27 16:48:33

+0

@DaveDopson我可以使用'underscore'來分析具有嵌套對象和數組的嵌套json嗎? – user227666 2014-02-20 09:47:35

203

我更喜歡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-09-11 23:19:44

+5

這個答案沒有描述如何檢查指定鍵的值。 – 2014-05-09 07:23:56

+8

@ColinSu但這也不是原來的問題。 'json.tool'只是簡單的打印json。如果你需要在shell腳本中提取/處理json數據,我會使用'jq',它是一個很棒的東西...... – muhqu 2014-05-09 08:04:28

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" 
} 
+0

如何在mac中安裝'jkid'? – user227666 2014-02-20 09:32:41

126

如果你正在尋找一個可移植的C編譯工具:

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

從網站:

JQ就像用於JSON數據的sed的 - 你可以使用它來分割和過濾並映射和轉換結構化數據,同樣易於使用sedawkgrep和朋友讓你玩文字。

jq可以很輕鬆地將數據格式轉換成您想要的數據格式,而且這樣做的程序通常比您期望的要短且簡單。

教程http://stedolan.github.com/jq/tutorial/
手冊http://stedolan.github.com/jq/manual/
下載http://stedolan.github.com/jq/download/

+18

這裏的最佳答案imo。沒有沉重的依賴關係,小巧,功能強大,良好的文檔和輕鬆試用。非常感謝您提出這個建議! – FrozenCow 2013-10-06 00:33:57

+0

在Ubuntu/Debian上,您可以「安裝jq」。 – 2017-12-11 17:35:57

1

對於猛砸/ 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 [email protected] 
    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。

Ex。 json_parser {field1} {field2}將運行print myjson['{field1}']['{field2}'],產生與空間分隔的{field2}相關聯的鍵或值。