ตัวแยกวิเคราะห์บรรทัดคำสั่ง JSON ของ Unix? [ปิด]


128

ทุกคนสามารถแนะนำ Unix (เลือกรสชาติของคุณ) ตัวแยกวิเคราะห์ JSON ที่สามารถใช้ในการพิจารณาค่าจากการตอบสนอง JSON ในไปป์ไลน์ได้หรือไม่?


ฉันชอบใช้ pythonpy ( github.com/russell91/pythonpy ): cat a.json | py --ji -x 'x.attr'
RussellStewart



1
มีเครื่องมือใหม่ในเมือง: ramda-cliซึ่งใช้ API curried API และ curated ของ LiveScript มันถูกสร้างขึ้นเพื่อใช้ json เป็นฟังก์ชันอินพุตและเขียน npm install -g ramda-cli
Ehvince

คำตอบ:


18

คุณสามารถใช้ parser บรรทัดคำสั่งนี้ (ซึ่งคุณสามารถใส่ในนามแฝงทุบตีหากคุณต้องการ) โดยใช้โมดูลที่สร้างขึ้นในแกน Perl:

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

1
ฉันสับสนกับผลลัพธ์ของสิ่งนี้ เอาต์พุตประกอบด้วยลูกศรไขมัน (=>) ระหว่างปุ่มและค่า นี่ไม่ใช่ JSON
แลนดอนคุห์น

7
@landon: ไม่อินพุตเป็น JSON และผลลัพธ์เป็นโครงสร้างข้อมูล Perl ดั้งเดิมซึ่งคุณสามารถดำเนินการต่อไปหากจำเป็น จุดหนึ่งของสายการบินนี้คือมันสร้างข้อมูลที่อ่านง่ายขึ้นมาก
อีเธอร์

1
หากคุณต้องการเอาต์พุต JSON คุณสามารถใช้ Perl one-liner:perl -e "use JSON; print to_json( decode_json(<>), { pretty => 1 } )"
Georgy Vladimirov

232

ฉันชอบpython -m json.toolที่ดูเหมือนว่าจะพร้อมใช้งานตามค่าเริ่มต้นในระบบปฏิบัติการ * ส่วนใหญ่ต่อการเริ่มต้น

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

แต่ควรสังเกตว่านี่จะเรียงลำดับคีย์ทั้งหมดตามลำดับตัวอักษรซึ่งเป็นหรืออาจเป็นสิ่งที่ดีในการที่ json ถูกสร้างขึ้นโดยภาษาบางภาษาที่ใช้ HashMaps ที่ไม่มีการเรียงลำดับ ...


5
คำตอบที่ไม่ถูกต้อง นี่เป็นทางเลือกบรรทัดคำสั่งที่ดีหากเป้าหมายคือการตรวจสอบความถูกต้องของไฟล์ JSON ที่ระบุว่ามี JSON ที่ถูกต้อง
scorpiodawg

10
คำตอบนี้ไม่ได้อธิบายวิธีตรวจสอบค่าของคีย์ที่ระบุ
โคลินซู

8
@ColinSu แต่นั่นก็ไม่ใช่คำถามเดิม json.toolเป็นเพียงมือสั้น ๆ ที่จะพิมพ์สวย ๆ หากคุณต้องการแยก / จัดการข้อมูล json ในเชลล์สคริปต์ฉันจะใช้jqสิ่งที่ยอดเยี่ยมอย่างแท้จริงในสิ่งที่เกิดขึ้น ...
muhqu

@muhqu ใช่ฉันรู้ว่าฉันใช้json.toolสิบครั้งต่อวัน ฉันคิดว่าฉันเข้าใจผิดความหมายของ "introspec" ในคำถามขอบคุณสำหรับการชี้ของคุณ
โคลินซู

1
IMMO นี่เป็นคำตอบที่ไม่ถูกต้องเนื่องจาก python json.toolทำสองสิ่งเท่านั้นคือตรวจสอบและพิมพ์ json มันไม่ใคร่ครวญค่าใน JSON เช่นjqไม่
Devy

144

หากคุณกำลังมองหาเครื่องมือรวบรวม C พกพา:

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

จากเว็บไซต์:

jq เปรียบเสมือนsedสำหรับข้อมูล JSON - คุณสามารถใช้มันเพื่อแบ่งและกรองและแม็พและแปลงข้อมูลที่มีโครงสร้างได้อย่างง่ายดายเช่นsed , awk , grepและเพื่อน ๆ ให้คุณเล่นกับข้อความ

jq สามารถทำให้รูปแบบข้อมูลที่คุณเก็บไว้ในรูปแบบที่คุณต้องการมีความพยายามน้อยมากและโปรแกรมที่จะทำนั้นมักจะสั้นและง่ายกว่าที่คุณคาดหวัง

บทช่วยสอน : http://stedolan.github.com/jq/tutorial/
คู่มือ : http://stedolan.github.com/jq/manual/
ดาวน์โหลด : http://stedolan.github.com/jq/download/


20
คำตอบที่ดีที่สุดในที่นี่ imo ไม่มีเอกสารอ้างอิงขนาดเล็กที่มีประสิทธิภาพเอกสารที่ดีและง่ายต่อการทดลองใช้ ขอบคุณมากที่แนะนำสิ่งนี้!
FrozenCow

บน Ubuntu / Debian apt install jqคุณสามารถเพียงแค่
Pablo A

jqผมถามหลาย-a-ดวงจันทร์ที่ผ่านมาและได้เรียนรู้ที่จะรัก
Jé Queue

63

ฉันได้สร้างโมดูลที่ออกแบบมาโดยเฉพาะสำหรับการจัดการ JSON ของบรรทัดคำสั่ง:

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

  • FLEXIBLE - เครื่องมือ "swiss-army-knife" สำหรับการประมวลผลข้อมูล JSON - สามารถใช้เป็นเครื่องพิมพ์ที่ใช้งานง่ายหรือใช้เป็นบรรทัดคำสั่ง Javascript
  • ที่มีประสิทธิภาพ - ตีแผ่อำนาจเต็มรูปแบบและฟังก์ชั่นของ underscore.js (บวก underscore.string)
  • ง่าย - ทำให้การเขียน JS one-liners คล้ายกับการใช้ "perl -pe" ง่าย ๆ
  • CHAINED - การร้องขอคำสั่งหลายคำสั่งสามารถโยงกันได้เพื่อสร้างขั้นตอนการประมวลผลข้อมูล
  • 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 "smart-whitespace" ที่ดีที่สุด:

หากคุณมีคำขอคุณสมบัติใด ๆ แสดงความคิดเห็นในโพสต์นี้หรือเพิ่มปัญหาใน GitHub ฉันยินดีที่จะจัดลำดับความสำคัญของคุณสมบัติที่สมาชิกในชุมชนต้องการ


! น่ากลัว แต่เป็นไปได้ไหมที่จะรันคำสั่งคอนโซลบนข้อมูล JSON ตัวอย่างเช่น: กำหนดไฟล์ JSON ที่มีอาร์เรย์wgetURL ทุก URL
Camilo Martin

@CamiloMartin - วิธีที่ง่ายที่สุดในการทำเช่นนั้นคือพิมพ์ URL หนึ่ง URL ต่อบรรทัดจากนั้นเรียกใช้ผ่าน xargs หรือ GNU ขนาน
Dave Dopson

@DaveDopson ฉันสามารถใช้underscoreในการแยกวิเคราะห์ json ที่มีวัตถุซ้อนกันและอาร์เรย์ได้หรือไม่
227666

1
@ user227666 - แน่นอน JSON รองรับการซ้อนวัตถุหลายระดับ หรือคุณอาจหมายถึง JSON ที่มีสตริงที่เข้ารหัส JSON เพิ่มเติม ซึ่งยังใช้งานได้ แต่ต้องการการ munging เพียงเล็กน้อย
Dave Dopson

@DaveDopson รองรับขีดเส้นใต้ "ประกอบด้วย" a "pattern" เช่น สำหรับ "คีย์" เฉพาะชุดของค่า (case-insenstitive) ที่เป็นไปได้? ฉันลอง "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"]``

ต้องรักเครื่องมือระดับเปลือกหอย :)
Jé Queue

12

นอกจากนี้ยังมีชุดเครื่องมือประมวลผลบรรทัดคำสั่ง JSONหากคุณมี node.js และ npm ในสแต็กของคุณ

และอีกคำสั่ง "json"สำหรับการนวด JSON บนบรรทัดคำสั่ง Unix ของคุณ

และนี่คือทางเลือกอื่น ๆ :


ที่เกี่ยวข้อง: เครื่องมือบรรทัดคำสั่งสำหรับการแยกวิเคราะห์อินพุต JSON สำหรับ Unix?


ติดตั้งง่ายบน Ubuntu: sudo apt-get install python-pip && sudo pip install jsonpipe
activout.se

@ divideandconquer.se ขออภัยคุณติดตั้งเครื่องมือนี้ใช้ NPM npm install jsonกับ
gitaarik

@rednaw แต่น่าเสียดายที่แพคเกจ NPM jsonดูเหมือนจะถูกครอบงำโดยแพคเกจที่แตกต่างอย่างสิ้นเชิงตอนนี้
แบรด

8

ใครพูดถึง Jshon หรือ JSON.sh?

https://github.com/keenerd/jshon

ไปป์ที่ json แล้วมันจะเคลื่อนที่ไปตามวัตถุ json และพิมพ์พา ธ ไปยังวัตถุปัจจุบัน (เป็นอาร์เรย์ JSON) จากนั้นจึงเป็นวัตถุโดยไม่มีช่องว่าง

http://kmkeen.com/jshon/
Jshon โหลดข้อความ json จาก stdin ทำการดำเนินการจากนั้นแสดงการกระทำล่าสุดใน stdout และยังได้เป็นส่วนหนึ่งของขั้นตอนการประมวลผลข้อความตามปกติ


ตัวอย่างการใช้งานใน OSX: brew install jshon,cat *.json | jshon
kenorb

2

คุณสามารถลองjsawkตามที่แนะนำในคำตอบนี้

จริงๆคุณสามารถชักจูงสคริปต์ python อย่างรวดเร็วเพื่อทำสิ่งนี้


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 มันอาจจะปรับให้เข้ากับรสนิยม

อย่างไรก็ตามมีบางสิ่งที่ผลิตเองสำหรับผู้ที่ไม่ต้องการแหล่งที่มาในการพึ่งพาภายนอกอื่น ยกเว้นหลามแน่นอน

อดีต json_parser {field1} {field2}จะเรียกใช้print myjson['{field1}']['{field2}']โดยให้คีย์หรือค่าที่เกี่ยวข้องกับ{field2}การคั่นด้วยช่องว่าง


0

ฉันเพิ่งทำjkidซึ่งเป็น json explorer บรรทัดคำสั่งขนาดเล็กที่ฉันทำเพื่อสำรวจวัตถุ 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 ได้อย่างไร?
227666
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.