ฉันจะพิมพ์ JSON ในเชลล์สคริปต์ได้อย่างไร


3061

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

โดยพื้นฐานแล้วฉันต้องการให้มันแปลงค่าต่อไปนี้:

{ "foo": "lorem", "bar": "ipsum" }

... เป็นอะไรเช่นนี้:

{
    "foo": "lorem",
    "bar": "ipsum"
}


7
ฉันย้อนกลับไปช่วงสั้น ๆ : github.com/exhuma/braindump/tree/master/jsonformatรหัสนั้นง่ายมากโดยใช้jsonไลบรารี่ของไพ ธ อน แต่ฉันเพิ่ม pygments และเน้นไวยากรณ์
exhuma

สะดุดไปที่นี้ แต่แล้วพบJson พริตตี้และฉันค่อนข้างชอบมัน Typekit ใช้มันในตัวอย่าง API ดังนั้นจึงมี klout อยู่ข้างหลังบ้าง ^^
Nick Tomlin

หากคุณไม่รังเกียจการคัดลอกการวางมีเครื่องมือออนไลน์ง่ายๆเช่นjsonprettyprint.netซึ่งคุณสามารถพิมพ์ JSON ดิบของคุณได้อย่างรวดเร็ว
Javaaaa

7
ถูกเตือน: python -m json.toolไม่ได้ผลิต JSON ที่ถูกต้องเสมอไป (คำแนะนำ: 1e1000)
สูงสุด

คำตอบ:


4460

ด้วย Python 2.6+ คุณสามารถทำได้:

echo '{"foo": "lorem", "bar": "ipsum"}' | python -m json.tool

หรือถ้า JSON อยู่ในไฟล์คุณสามารถทำได้:

python -m json.tool my_json.json

หาก JSON มาจากแหล่งอินเทอร์เน็ตเช่น API คุณสามารถใช้

curl http://my_url/ | python -m json.tool

เพื่อความสะดวกในทุกกรณีคุณสามารถใช้นามแฝงได้:

alias prettyjson='python -m json.tool'

เพื่อความสะดวกยิ่งขึ้นด้วยการพิมพ์เพิ่มอีกเล็กน้อยเพื่อให้พร้อม:

prettyjson_s() {
    echo "$1" | python -m json.tool
}

prettyjson_f() {
    python -m json.tool "$1"
}

prettyjson_w() {
    curl "$1" | python -m json.tool
}

สำหรับทุกกรณีข้างต้น คุณสามารถใส่.bashrcมันเข้าไปและมันจะใช้ได้ทุกครั้งในเชลล์ prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'เรียกมันเหมือน


73
คุณสามารถไพพ์ลงบนpygmentize -l javascriptเพื่อรับเอาต์พุตสีไวยากรณ์ในบรรทัดคำสั่งของคุณ แก้ไข : หากคุณมีการติดตั้ง pygments นั่นคือ
Shrikant Sharat

177
คำตอบที่ดีเพียง แต่ระมัดระวังที่ฉันมีกับมันมันไม่เรียงปุ่มบนเอาท์พุท - ซึ่งคุณอาจจะต้องตระหนักถึง
Chris Nash

14
ใน myy .vimrc "nnoremap <f5>:%! python -m json.tool <CR>: w <CR>"
imwilsonxu

40
ดูเหมือนว่าจะหลบหนีอักขระ Unicode ไปที่ \ uXXXX ซึ่งอาจเป็นข้อเสีย
user1071136

14
ฉันได้สร้างนามแฝง: เพื่อที่ฉันก็สามารถเรียกใช้:alias pretty='python -mjson.tool | pygmentize -l json command params | prettyหวังว่านี่จะช่วยได้ PS: หากใครก็ตามสามารถขยายสิ่งนี้เป็น a) เอา curl-output ที่ฉันเห็นทุกครั้งและ / หรือ b) อย่าเรียงลำดับคีย์ json; โปรดแจ้งให้เราทราบฉันจะขอบคุณมาก
Clint Eastwood

1023

คุณสามารถใช้ได้: jq

มันใช้ง่ายมากและใช้งานได้ดีมาก! สามารถจัดการโครงสร้าง JSON ที่มีขนาดใหญ่มากรวมถึงสตรีม คุณสามารถค้นหาบทเรียนของพวกเขาที่นี่

ตัวอย่างการใช้งาน:

$ jq --color-output . file1.json file1.json | less -R

$ command_with_json_output | jq .

$ jq . # stdin/"interactive" mode, just enter some JSON

$ jq . <<< '{ "foo": "lorem", "bar": "ipsum" }'
{
  "bar": "ipsum",
  "foo": "lorem"
}

ส่วน เป็นตัวกรองตัวตน


11
นอกจากนี้ยังมี--sort-keysตัวเลือกซึ่งมีประโยชน์ในบางกรณี
Matthew Flaschen

9
ทำงานกับ curl:curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
Hover Ruan

19
"jq." ดีเยี่ยมเหมือนเครื่องพิมพ์สวย ๆ แต่มาพร้อมกับ caveat: jq (สูงสุดและรวมถึง jq เวอร์ชั่น 1.5) จะเปลี่ยนค่าของตัวเลขที่มีขนาดใหญ่มากและเล็กมากเพราะจะวิเคราะห์ค่าตัวเลขเป็น IEEE 754 64- บิตค่า หากต้องการตรวจสอบว่าเครื่องพิมพ์สวยที่คุณชื่นชอบมีปัญหาเดียวกันหรือไม่ให้ลองใช้ค่านี้: 1e1000 โปรดทราบว่าpython -mjson.toolล้มเหลวในการทดสอบนี้อย่างมากเนื่องจากมันสร้าง Infinity ซึ่งไม่ใช่แม้แต่ JSON
สูงสุด

1
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfileเป็นบันทึกคุณสามารถเปลี่ยนเส้นทางผลการจัดรูปแบบไฟล์:
ชาด

26
@Meekohi ทางเลือกคือ "ใช้ echo โดยไม่จำเป็น" มีความสุขสุด ๆ ที่ได้พบ<<<ผู้ดำเนินการ - สิ่งที่ฉันกำลังมองหา
jchook

381

ฉันใช้อาร์กิวเมนต์ "space" ของJSON.stringifyเพื่อพิมพ์ JSON ใน JavaScript

ตัวอย่าง:

// Indent with 4 spaces
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, 4);

// Indent with tabs
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, '\t');

จากบรรทัดคำสั่ง Unix ด้วย Node.js การระบุ JSON บนบรรทัดคำสั่ง:

$ node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
  '{"foo":"lorem","bar":"ipsum"}'

ผลตอบแทน:

{
    "foo": "lorem",
    "bar": "ipsum"
}

จากบรรทัดคำสั่ง Unix ด้วย Node.js การระบุชื่อไฟล์ที่มี JSON และใช้การเยื้องของช่องว่างสี่:

$ node -e "console.log(JSON.stringify(JSON.parse(require('fs') \
      .readFileSync(process.argv[1])), null, 4));"  filename.json

ใช้ท่อ:

echo '{"foo": "lorem", "bar": "ipsum"}' | node -e \
"\
 s=process.openStdin();\
 d=[];\
 s.on('data',function(c){\
   d.push(c);\
 });\
 s.on('end',function(){\
   console.log(JSON.stringify(JSON.parse(d.join('')),null,2));\
 });\
"

10
สำหรับการดีบักอ็อบเจ็กต์ใน Node.js คุณควรใช้ sys.inspect () แทน JSON.stringify () นี่คือเหตุผล: markhansen.co.nz/inspecting-with-json-stringify
Gurpartap Singh

11
downvoted OP เป็นเรื่องเกี่ยวกับ "* nix command-line script" และคำตอบนี้เป็นบริบทที่แตกต่างกัน
danorton

49
@danorton: JS สามารถใช้จาก commandline ผ่าน node.js และวิธีแก้ไขอื่น ๆ ที่คล้ายคลึงกัน
calvinf

10
ไม่ต้องการคอนโซล: node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"ยังส่งผลลัพธ์ให้ STDOUT
Julian D.

2
มันแย่ที่สคริปต์จะแตกต่างกันสำหรับชื่อไฟล์กับ stdin
Lukasz Wiktor

340

ฉันเขียนเครื่องมือที่มีหนึ่งใน formatters "smart whitespace" ที่ดีที่สุด มันสร้างเอาต์พุตที่สามารถอ่านได้และ verbose น้อยกว่าตัวเลือกอื่น ๆ ส่วนใหญ่ที่นี่

ขีด-CLI

นี่คือลักษณะของ "smart whitespace":

ฉันอาจจะลำเอียงเล็กน้อย แต่มันเป็นเครื่องมือที่ยอดเยี่ยมสำหรับการพิมพ์และจัดการข้อมูล JSON จากบรรทัดคำสั่ง มันใช้งานง่ายสุด ๆ และมีวิธีใช้ / เอกสารประกอบคำสั่งมากมาย มันเป็นมีดทหารสวิสที่ฉันใช้กับงานเล็ก ๆ ที่แตกต่างกัน 1,051 ชิ้นซึ่งน่ารำคาญอย่างมากที่จะทำอย่างอื่น

กรณีใช้งานล่าสุด: Chrome, คอนโซล Dev, แท็บเครือข่ายส่งออกทั้งหมดเป็นไฟล์ HAR, "cat site.har | ขีดล่างเลือก '. url' - ข้อความ outfmt | grep mydomain"; ตอนนี้ฉันมีรายการสั่ง URL ดึงทั้งหมดตามลำดับเวลาในระหว่างการโหลดเว็บไซต์ของ บริษัท ของฉัน

การพิมพ์แบบสวยง่าย:

underscore -i data.json print

สิ่งเดียวกัน:

cat data.json | underscore print

สิ่งเดียวกันชัดเจนมากขึ้น:

cat data.json | underscore print --outfmt pretty

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


4
ฉันยังอัปเดตของฉัน ~ / .bash_profile เพื่อให้มีบรรทัดต่อไปนี้: alias underscor = 'underscore print --outfmt pretty' ตอนนี้ฉันสามารถทำ curl example.com/result.json | ขีดล่างและยังคงใช้ขีดเส้นใต้สำหรับการจัดรูปแบบอื่น ๆ
Gal Bracha

ขอบคุณเดฟ! เครื่องมือดี! alias pretty-json = "underrsore pretty" และขดเอาท์พุทที่ถูกใจ
Maxim Ponomarev

เครื่องมือการจัดรูปแบบที่ยอดเยี่ยมเพียงหนึ่งหมายเหตุ: การส่งต่อเอาต์พุตไปยังไฟล์ (ไม่ว่าจะด้วยตัวเลือก-oหรือด้วย> ) ใช้ได้กับการพิมพ์ขีดล่างเท่านั้น ขีดสวยบันทึกไฟล์ที่มีการจัดรูปแบบสีสัญญาณถูกแทรกบที่ชอบ: [32m, [33m, [39mพร้อมกับบางส่วนที่ไม่สามารถพิมพ์ก่อนที่แต่ละของพวกเขาซึ่งจะทำให้ JSON ไม่ถูกต้อง อย่างไรก็ตามการขีดเส้นใต้พิมพ์เพียงอย่างเดียวไม่ได้เพิ่มสิ่งใด ๆ ลงในไฟล์และทำการจัดรูปแบบงานได้อย่างสมบูรณ์แบบ
tiurin

ฉันชอบjqแต่สิ่งนี้ใช้งานได้ดีสำหรับ "JSON" ของฉันซึ่งไม่มีคีย์ที่ยกมาสองเท่า
Bluu

@DaveDopson ขอบคุณสำหรับเครื่องมือที่ยอดเยี่ยม !! ลองใช้กับjsonselect.org/#tryit ...
mycargus

173

ฉันมักจะทำ:

echo '{"test":1,"test2":2}' | python -mjson.tool

และเพื่อดึงข้อมูลที่เลือก (ในกรณีนี้ค่าของ "test"):

echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]'

หากข้อมูล JSON อยู่ในไฟล์:

python -mjson.tool filename.json

หากคุณต้องการที่จะทำทั้งหมดในครั้งเดียวไปกับcurlในบรรทัดคำสั่งโดยใช้โทเค็นการตรวจสอบ:

curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool

ถ้า json ควรมาโดยตรงจาก http api นี่เป็นเครื่องมือที่ใช้ใน python: github.com/jkbr/httpie
Florian

หากคุณติดตั้งโหนด (และไม่คำนึงถึงเอาต์พุตสไตล์ YAML) นอกจากนี้ยังมีแพคเกจนี้: rafeca.com/prettyjsonเพื่อให้คุณสามารถจบการม้วนด้วย | prettyjson
Iolo

3
ดังที่กล่าวไว้ข้างต้นปัญหาอย่างหนึ่งของpython -mjson.toolในฐานะเครื่องพิมพ์สวย JSON ก็คือมันไม่ได้เปล่ง JSON เสมอไป เช่น 1e1000 กลายเป็นอินฟินิตี้ (ไม่ว่าจะใช้ python 2.x หรือ 3.x) 'jq.' สร้าง JSON เสมอ แต่ไม่รับประกันว่าจะมีค่ามาก (หรือมีค่าน้อยมาก) อย่างแน่นอน
สูงสุด

88

ขอขอบคุณพอยน์เตอร์ที่มีประโยชน์มากของเจ. เจ. เซบาสเตียนนี่เป็นสคริปต์ที่ได้รับการปรับปรุงเล็กน้อยที่ฉันได้รับ:

#!/usr/bin/python

"""
Convert JSON data to human-readable form.

Usage:
  prettyJSON.py inputFile [outputFile]
"""

import sys
import simplejson as json


def main(args):
    try:
        if args[1] == '-':
            inputFile = sys.stdin
        else:
            inputFile = open(args[1])
        input = json.load(inputFile)
        inputFile.close()
    except IndexError:
        usage()
        return False
    if len(args) < 3:
        print json.dumps(input, sort_keys = False, indent = 4)
    else:
        outputFile = open(args[2], "w")
        json.dump(input, outputFile, sort_keys = False, indent = 4)
        outputFile.close()
    return True


def usage():
    print __doc__


if __name__ == "__main__":
    sys.exit(not main(sys.argv))

3
เมื่อโหลดค่าลงในพจนานุกรมลำดับจะหายไป: dictวัตถุปกติไม่มีลำดับที่กำหนดไว้ ลองjson.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)แล้วคุณจะพบว่าพวกเขาเปลี่ยน หากต้องการแก้ไขให้นำเข้าOrderedDictและloadส่งobject_pairs_hook=OrderedDictต่อ
icktoofay

inputFile = sys.stdinคุณสามารถเปลี่ยนสคริปต์เพื่ออ่านจากอินพุตมาตรฐานด้วยนี้ สิ่งนี้ช่วยให้คุณไพพ์ของสคริปต์ได้ดังนี้:curl http://somewhere.com/foo.json | pp_json.py
Gabe Johnson

1
และเพื่อหลีกเลี่ยงการเรียงลำดับด้วย @ icktoofay ของความคิดเห็น OrderedDict from collections import OrderedDictนำเข้าเช่นนี้
Hugo

2
ขอบคุณ @icktoofay สิ่งนี้ทำให้ฉันสามารถสร้างฟังก์ชั่นเสียงเรียกเข้าดังต่อไปนี้: com! FormatJSON %!python -c "from collections import OrderedDict; import sys; import json; j = json.load(sys.stdin, object_pairs_hook=OrderedDict); json.dump(j, sys.stdout, sort_keys=False, indent=4, separators=(',', ': '))" โปรดทราบว่าตัวคั่นต้องถูกตั้งค่าเป็น (',', ':') เพื่อหลีกเลี่ยงการเพิ่มช่องว่างต่อท้าย: bugs.python.org/issue16333
blindsnowmobile

ตัวอย่างที่ยอดเยี่ยม! ฉันใช้sort_keys = Trueแทนเพราะฉันต้องการใช้สิ่งนี้เพื่อเปรียบเทียบไฟล์ json และใช้งานได้อย่างมีเสน่ห์
JL Peyret

81

ถ้าคุณใช้ NPM และ Node.js คุณสามารถทำแล้วท่อคำสั่งผ่านnpm install -g json jsonทำjson -hเพื่อให้ได้ตัวเลือกทั้งหมด -iนอกจากนี้ยังสามารถดึงออกมาจากเขตข้อมูลที่เฉพาะเจาะจงและมีสีสันที่มีเอาท์พุท

curl -s http://search.twitter.com/search.json?q=node.js | json

79

มันไม่ง่ายเกินไปด้วยวิธีพื้นเมืองที่มีเครื่องมือ JQ

ตัวอย่างเช่น:

cat xxx | jq .

7
คำเตือน: jq เข้ารหัสตัวเลขเป็น IEEE 754 64 บิตลอยตัวและดังนั้นการแสดงของพวกเขามีแนวโน้มที่จะเปลี่ยน ความแม่นยำของตัวเลขที่น้อยมากและมีขนาดใหญ่มากนั้นน่าจะหายไป หากต้องการตรวจสอบว่าเครื่องพิมพ์สวยที่คุณชื่นชอบมีปัญหาเดียวกันหรือไม่ให้ลองใช้ค่านี้: 1e1000
จุดสูงสุด

5
หรือเพียงแค่: jq . file.json; แต่ยังcat file.json | jq(ไม่มีตัวกรอง.) ยังใช้งานได้ (ในอูบุนตู / ลินุกซ์; YMMV ข้ามแพลตฟอร์ม)
ไมเคิล

73

ด้วย Perl JSON::XSใช้โมดูล json_xsจะติดตั้งเครื่องมือบรรทัดคำสั่ง

ตรวจสอบ:

json_xs -t null < myfile.json

ระบุไฟล์ JSON ไว้ล่วงหน้าsrc.jsonเพื่อpretty.json:

< src.json json_xs > pretty.json

หากคุณไม่ได้ลองjson_xs json_pp"pp" สำหรับ "เพอร์เพิร์ล" - เครื่องมือนี้ใช้งานใน Perl เท่านั้นโดยไม่ต้องผูกกับไลบรารี C ภายนอก (ซึ่งเป็นสิ่งที่ XS หมายถึง "Extension System" ของ Perl)


9
ดูเหมือนจะมาเป็นมาตรฐานกับ Cygwin!
Janus Troelsen

12
json_pp สามารถใช้ในลักษณะเดียวกันและอาจติดตั้งได้อย่างง่ายดายบนระบบของคุณ (บน Debian มันอยู่ในแพ็คเกจ 'perl')
MichielB

8
FYI บนระบบ Mac OS X 10.9 ของฉัน json_pp พร้อมใช้งานโดยอัตโนมัติ
เกร็กวิลเลียมส์

-t nullให้ฉันเป็นโมฆะ: ไม่ใช่รูปแบบที่ถูกต้อง ... แต่ทิ้งไว้อย่างสวยงาม ขอบคุณ
Lucas

pp สำหรับเพอร์ลเพียวไม่ใช่งานพิมพ์สวยที่นี่ :) เนื่องจาก json_xs และ json_pp สามารถทำได้มากกว่าแค่พิมพ์สวยและด้วย -json_opt ทำสิ่งอื่นแทนการพิมพ์สวย แม้ว่าการพิมพ์ที่สวยนั้นเป็นพฤติกรรมเริ่มต้น
Kjetil S.

70

บน * ระวังการอ่านจาก stdin และการเขียนไปยัง stdout ทำงานได้ดีขึ้น:

#!/usr/bin/env python
"""
Convert JSON data to human-readable form.

(Reads from stdin and writes to stdout)
"""

import sys
try:
    import simplejson as json
except:
    import json

print json.dumps(json.loads(sys.stdin.read()), indent=4)
sys.exit(0)

ใส่สิ่งนี้ลงในไฟล์ (ฉันตั้งชื่อฉันว่า "prettyJSON" ตามคำตอบของAnC ) ใน PATH ของคุณchmod +xแล้วคุณก็ทำได้ดี


แท้จริงแล้วการใช้ stdin / stdout นั้นยืดหยุ่นและเรียบง่ายกว่ามาก ขอบคุณที่ชี้นำ
AnC

3
สำหรับโปรแกรมที่ต้องการไฟล์ที่ระบุให้ใช้ / dev / stdin, ditto เพื่อออกและทำ
dvogel

4
FYI fileinput.input()อ่านจาก stdin หากไม่มีไฟล์ที่กำหนดในบรรทัดคำสั่ง ตัวอย่าง
jfs

fileinput.input () ไม่สามารถจัดการกับไฟล์ที่ไม่มีบรรทัดใหม่ในตอนท้ายครั้งสุดท้ายที่ฉันตรวจสอบ
Zachary Vance

เขาถามด้วยเชลล์สคริปไม่ใช่ภาษาไพ ธ อน ด้วย JQ สามารถทำได้อย่างสมบูรณ์แบบ
Bui Anh Tuan

65

JSON Ruby Gem มาพร้อมกับเชลล์สคริปต์เพื่อให้ JSON มีความน่าสนใจ:

sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb

ดาวน์โหลดสคริปต์: gist.github.com/3738968


6
โปรดทราบว่าการแก้ปัญหานี้ถอดรหัส Unicode ว่า "\ uxxxx" json.toolลำดับหนีเหมือนงูหลามเป็นหนึ่งเดียวกับ อย่างไรก็ตามดูเหมือนว่าจะมีข้อ จำกัด เชิงลึกของการซ้อน ( nesting of 20 is too deep (JSON::NestingError))
a3nm

2
บน Ubuntu คุณสามารถทำได้: sudo apt-get install ruby-json-pureแทนที่จะgem install
Janus Troelsen

1
`` `eric-mbp: ~ ericstob $ sudo gem ติดตั้ง json รหัสผ่าน: การดึง: json-1.7.3.gem (100%) การสร้างส่วนขยายดั้งเดิม อาจใช้เวลาสักครู่ ... ติดตั้ง json-1.7.3 เรียบร้อยแล้วติดตั้ง 1 อัญมณีติดตั้งเอกสาร ri สำหรับ json-1.7.3 ... กำลังติดตั้งเอกสาร RDoc สำหรับ json-1.7.3 ... eric-mbp: ~ ericstob $ prettify_json .rb -bash: prettify_json.rb: ไม่พบคำสั่ง
Eric Hartford

บางทีคุณสามารถโพสต์เนื้อหาของคุณprettify_json.rb?
แอนดรู

คุณสามารถดาวน์โหลดสคริปต์ที่ย้ายไปยังคุณ~/binโฟลเดอร์ (ให้แน่ใจว่ามันอยู่ในเส้นทางของคุณ) เปลี่ยนชื่อprettify_json.rbไปและเรียกใช้ppj chmod +x ppjตอนนี้คุณสามารถทำสิ่งที่ต้องการcurl www.jsonsring.com/something.json | ppj
Uri

58

อัพเดทฉันใช้jqตอนนี้ตามที่แนะนำในคำตอบอื่น มันมีประสิทธิภาพอย่างมากในการกรอง JSON แต่ที่พื้นฐานที่สุดก็เป็นวิธีที่ยอดเยี่ยมในการพิมพ์ JSON ที่น่ารักสำหรับการดู

jsonppเป็นเครื่องพิมพ์บรรทัดคำสั่งที่สวยมาก JSON

จาก README:

พริตตี้ตอบสนองบริการพิมพ์เว็บสวยเช่น:

curl -s -L http://<!---->t.co/tYTq5Pu | jsonpp

และทำให้ไฟล์ต่าง ๆ สวยงามบนดิสก์ของคุณ:

jsonpp data/long_malformed.json

หากคุณบน Mac OS X brew install jsonppคุณสามารถ $PATHถ้าไม่ได้คุณก็สามารถคัดลอกไบนารีไปที่ไหนสักแห่งในของคุณ


1
ฉันลอง jsonpp (เคยประสบความสำเร็จในอดีต) กับไฟล์ขนาดใหญ่ (> 60MB) ฉันหยุดมันหลังจาก 5 นาที ฉันส่งไปที่python -mjson.tool(จากคำตอบอื่น ๆ ที่นี่) และใช้เวลา 10-20 วินาที ...
volker

JSON ขนาด 60MB? ว้าว! ปกติฉันไม่ได้จัดการกับไฟล์ที่มีขนาดใหญ่ แต่มีประโยชน์ที่จะรู้ ขอบคุณ
jordelver

บน Ubuntu ของฉันกล่องฉันมีjson_pp- ที่ไม่รูปแบบ JSON อย่างแม้แม้จะมีความคล้ายคลึงกันในการตั้งชื่อผมเชื่อว่านี้จะเป็นโครงการที่แตกต่างอย่างสิ้นเชิงจากjsonppที่กล่าวถึงนี่
davidpricedev

56

นั่นเป็นวิธีที่ฉันทำ:

curl yourUri | json_pp

มันย่อโค้ดและทำให้งานเสร็จ


3
เซิร์ฟเวอร์อูบุนตู: หากคุณมีเครื่องที่ใช้งานจริงซึ่งมีการติดตั้งที่ จำกัด มากนี่อาจเป็นตัวเลือกที่ดีที่สุดเนื่องจากมีการติดตั้งตามค่าเริ่มต้นภายใต้ชื่อเฉพาะ Python มักจะติดตั้งในรูปแบบที่แตกต่างกัน (เช่น python3, python หรือไม่เลย) ขึ้นอยู่กับรุ่น
jonathanjo

55

สคริปต์ทุบตีง่ายสำหรับการพิมพ์ json สวย

json_pretty.sh

#/bin/bash

grep -Eo '"[^"]*" *(: *([0-9]*|"[^"]*")[^{}\["]*|,)?|[^"\]\[\}\{]*|\{|\},?|\[|\],?|[0-9 ]*,?' | awk '{if ($0 ~ /^[}\]]/ ) offset-=4; printf "%*c%s\n", offset, " ", $0; if ($0 ~ /^[{\[]/) offset+=4}'

ตัวอย่าง:

cat file.json | json_pretty.sh

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

2
นั่นเป็นเพียงคำตอบที่ใช้งานได้ฉันพบ ฉันมีลินุกซ์ฝังตัว - rubby ไม่มีจาวาสคริปต์ไม่มีไม่มีการเข้าถึงอินเทอร์เน็ตเพื่อดาวน์โหลดโมดูลหลาม ... ฉันมี awk แตกต่างกันเล็กน้อยที่ไม่สนับสนุนการ%*cสัญกรณ์เพื่อให้ผมเปลี่ยนไปprintf c=0; while (c++<offset) printf " "; printf $0;และ awk ของฉันมี regex []ที่แตกต่างกันการหลบหนีและทับขวาไม่ทำงานใน ผมเปลี่ยน regexes ไปและ/^[[{]/ /[]}]/
Zaboj Campula

2
นี้ควรจะได้รับการยอมรับเป็นมันเต็มรูปแบบพื้นเมืองและไม่จำเป็นต้องมีซอฟต์แวร์ของบุคคลที่สาม ...
ขโมย

1
@EvgenyKarpov จับดีที่จำเป็นสำหรับการย้อนกลับเต็มไม่เพียงgrepที่ถูกลบโดยไม่ได้ตั้งใจ;)
ขโมย

1
ขอบคุณเพื่อนฉันต้องการวิธีที่รวดเร็วในการฟอร์แมต json แบบซับในขนาด 8MB ในแบบทุบตีเรียบง่าย
อาเหม็ดเอ็ม

53

ลองpjsonดู มันมีสี!

echo '{"json": "obj"} |  pjson

ติดตั้งด้วยpip:

⚡ pip install pjson

และแล้วท่อเนื้อหา JSON ใด ๆ pjsonที่จะ


มันต้องใช้ python-pip (sudo apt-get install python-pip) จากนั้น (sudo pip install pjson) ข้อได้เปรียบที่ยอดเยี่ยมคือสี!
Kristjan Adojaan

1
ข้อเสียคือมันเป็นไปไม่ได้ที่จะ grep เอาท์พุทสี
Kristjan Adojaan

51
$ echo '{ "foo": "lorem", "bar": "ipsum" }' \
> | python -c'import fileinput, json;
> print(json.dumps(json.loads("".join(fileinput.input())),
>                  sort_keys=True, indent=4))'
{
    "bar": "ipsum",
    "foo": "lorem"
}

หมายเหตุ: มันไม่ได้เป็นวิธีที่จะทำมัน

เหมือนกันใน Perl:

$ cat json.txt \
> | perl -0007 -MJSON -nE'say to_json(from_json($_, {allow_nonref=>1}), 
>                                     {pretty=>1})'
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

หมายเหตุ 2: ถ้าคุณเรียกใช้

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print(json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4))'

คำที่อ่านได้อย่างดีกลายเป็น \ u เข้ารหัส

{
    "D\u00fcsseldorf": "lorem", 
    "bar": "ipsum"
}

หากที่เหลือของท่อของคุณได้อย่างสง่างามจะจัดการ Unicode และคุณต้องการ JSON ของคุณยังเป็นมิตรกับมนุษย์เพียงแค่การใช้งาน ensure_ascii=False

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4, ensure_ascii=False)'

และคุณจะได้รับ:

{
    "Düsseldorf": "lorem", 
    "bar": "ipsum"
}

ที่จริงผมทำเช่นเดียวกัน แต่มีจาวาสคริปต์เอง :)
โรเบิร์ตโกลด์

2
ในรุ่นของโมดูล JSON ที่ฉันมีto_jsonดูเหมือนจะไม่ยอมรับตัวเลือก แต่งานนี้:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
Rörd

ตัวอย่างของ Python นั้นสามารถทำให้ง่ายขึ้นได้ มันง่ายมากที่จะส่งออกท่อ JSON python -m json.toolตรงเข้า
Dan Loewenherz

@ แดน: ใช่ และมีหลายคำตอบที่แสดงjson.toolตัวอย่างรหัส 1. รุ่นนี้อนุญาตให้คุณเปลี่ยนพารามิเตอร์บางอย่างเช่น, indent2 , ณ เวลาที่โพสต์ (2008) Python 2.4 ยังคงใช้อยู่ซึ่งไม่รองรับ-mjson.tool
jfs

40

ฉันใช้jshonทำสิ่งที่คุณกำลังอธิบาย เพิ่งรัน:

echo $COMPACTED_JSON_TEXT | jshon

คุณยังสามารถส่งอาร์กิวเมนต์เพื่อแปลงข้อมูล JSON


ขอบคุณ jshon เป็นจำนวนมากเร็วกว่าการใช้หลามหรือทับทิมสำหรับงานเดียวกัน
อเล็กซานเด

2
@Alexander - คุณต้องการเครื่องพิมพ์ที่สวยขนาดไหน ฉันใช้ OSx Lion ที่ติดตั้ง Python ไว้ล่วงหน้า ด้วย python -mjson.tool ฉันสามารถพิมพ์ไฟล์ 96KB json ได้ใน 0.1s - เอาท์พุท json ของ earthporn ที่ jshon ลิงก์ไปที่ประมาณ 24KB และฉันสามารถพิมพ์ได้ใน 0.08s jshon เร็วแค่ไหนสำหรับคุณ
joensson

1
ฉันทำงานกับการบีบอัด 1 + GB (ผู้ที่รู้วิธีบีบอัดไฟล์ข้อมูลขนาดใหญ่) ฉันจึงขอขอบคุณคำแนะนำที่ jshon เร็วขึ้น
Ryan Ballantyne

38

หรือด้วย Ruby:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'

นั่นทำให้ฉันมีข้อผิดพลาด คุณต้องการแพ็คเกจทับทิมติดตั้ง json หรือไม่?
mjs

3
ใช่คุณต้องใช้ JSON Ruby Gem: sudo gem install json
darscan

@MatSchaffer โปรดทราบว่านี่จะไม่ทำงานหากคุณใช้ JSON เพื่อทำให้เป็นอันดับวัตถุด้วยto_jsonวิธีการที่กำหนดเอง; Kernel#jjพิมพ์อาร์เรย์และแฮชที่สวยเท่านั้น (หรือตัวเลข / สตริง / บูลีน) เดียวกัน
Phrogz

สำหรับ Windows ลองทำสิ่งนี้: echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
Ross Attrill

36

ตรวจสอบJazor มันเป็นตัวแยกวิเคราะห์บรรทัดคำสั่ง JSON อย่างง่ายที่เขียนด้วยรูบี

gem install jazor
jazor --help

4
เป็นแค่ฉันหรือนี่เป็นข้อเสนอแนะเดียวที่จริง ๆ แล้วตอบคำถามของ OP หรือไม่? ฉันมาที่นี่เพื่อค้นหาคำสั่งง่ายๆที่ฉันสามารถส่งออกท่อของcurlและนี่เป็นเพียงคนเดียวที่ทำเพื่อฉัน
Leo Cassarani

2
ฉันชอบที่มันมีตัวเลือกในการปรับสีเอาท์พุท ทำให้อ่านง่ายขึ้น
แอนดรู

ooh ฉันยังต้องการตัวเลือกในการส่ง URL เนื่องจากฉันใช้สิ่งนี้เพื่อดูผลลัพธ์ของ REST API ของฉัน
Andrew

35

คุณสามารถใช้คำสั่งง่าย ๆ นี้เพื่อให้ได้ผลลัพธ์:

echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool

คำตอบที่ดีที่สุดในความคิดของฉัน ขนาดเล็กและจดจำได้ง่ายและไม่จำเป็นต้องติดตั้งเครื่องมือที่ไม่ได้มาตรฐาน
Eugene C

python -m json.tool ดูเหมือนจะไม่รักษาลำดับของวัตถุ JSON
pushNpop


28

jq .เพียงแค่ท่อออกไป

ตัวอย่าง:

twurl -H ads-api.twitter.com '.......' | jq .

คำตอบที่ดี @Ackshaey Singh และอีกหนึ่งสามารถส่งไฟล์เดียวกันซ้ำอีกครั้งได้อย่างง่ายดายเช่นกัน เช่นcat <file_name.txt> | jq . > <output_name.txt>
ปราโมทย์

9
brew install jqหากคุณใช้ mac os
Distwo

1
แต่น่าเสียดายที่ใช้jq .สำหรับการพิมพ์สวยมีหนึ่งที่มีศักยภาพอุปสรรค: ทุกรุ่นที่ยังหลงเหลืออยู่ของ JQ ยืนยันในการรักษาหมายเลข JSON หมายเลข IEEE เพื่อความแม่นยำจะหายไปได้อย่างง่ายดายเช่นสำหรับจำนวนเต็มมีขนาดใหญ่มาก
สูงสุด

2
@ ปราโมทย์cat file |เป็นกระบวนการที่เสียไปอย่างสม่ำเสมอ แค่ทำjq . <file_name.txt >output_name.txt(กับตัวอักษร<และ>ตัวอักษร)
Mark Reed

24

Pygmentize

ฉันรวม json.tool ของ Python กับการเพิ่มจำนวน:

echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g

มีทางเลือกบางอย่างเพื่อ pygmentize ซึ่งมีการระบุไว้ในที่มีคำตอบนี้ของฉัน

นี่คือตัวอย่างสด:

การสาธิต


5
บางครั้งต้องใช้pygmentize -l jsonเพื่อรับ colourfication
JP

ติดตั้งด้วยแพ็คเกจ apt python-pygmentsเช่นapt-get install python-pygments
jan

23

ด้วย Perl หากคุณติดตั้งJSON :: PPจาก CPAN คุณจะได้รับคำสั่งjson_pp ขโมยตัวอย่างจากB Bycroftคุณจะได้รับ:

[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

เป็นมูลค่าการกล่าวขวัญว่าjson_ppติดตั้งมาพร้อมกับ Ubuntu 12.04 (อย่างน้อย) และ Debian in/usr/bin/json_pp


19

ฉันแนะนำให้ใช้ยูทิลิตีบรรทัดคำสั่ง json_xs ซึ่งรวมอยู่ในโมดูล per JSON :: XS JSON :: XS เป็นโมดูล Perl สำหรับ serializing / deserializing JSON บนเครื่อง Debian หรือ Ubuntu คุณสามารถติดตั้งได้ดังนี้:

sudo apt-get install libjson-xs-perl

จะเห็นได้ชัดนอกจากนี้ยังมีในCPAN

หากต้องการใช้เพื่อจัดรูปแบบ JSON ที่ได้รับจาก URL คุณสามารถใช้ curl หรือ wget ดังนี้:

$ curl -s http://page.that.serves.json.com/json/ | json_xs

หรือสิ่งนี้:

$ wget -q -O - http://page.that.serves.json.com/json/ | json_xs

และเพื่อจัดรูปแบบ JSON ที่มีอยู่ในไฟล์คุณสามารถทำได้:

$ json_xs < file-full-of.json

หากต้องการฟอร์แมทใหม่เป็นYAMLซึ่งบางคนคิดว่าเป็นมนุษย์ที่อ่านง่ายกว่า JSON:

$ json_xs -t yaml < file-full-of.json

19

คุณสามารถใช้เครื่องมือมาตรฐานเช่น jq หรือ json_pp

echo '{ "foo": "lorem", "bar": "ipsum" }' | json_pp

หรือ

echo '{ "foo": "lorem", "bar": "ipsum" }' | jq

ทั้งสองจะ prettify เอาต์พุตดังต่อไปนี้ (jq ยิ่งมีสีสัน)

{
  "foo": "lorem",
  "bar": "ipsum"
}

ข้อได้เปรียบที่ยิ่งใหญ่ของ jq คือมันสามารถทำอะไรได้มากขึ้นถ้าคุณต้องการแยกวิเคราะห์และประมวลผล json


json_pp ใช้ Mac ของฉัน - แต่ไม่ใช่ jq ขอบคุณ!
David H

1
@DavidH - ทำสิ่งนี้: stackoverflow.com/questions/37668134/…
Schmitzi

ขอบคุณ! ไม่เคยได้ยินชื่อ jq มาก่อน
David H H

17

jjนั้นเร็วมากสามารถจัดการเอกสาร JSON แบบ ginormous ได้โดยไม่ยุ่งกับหมายเลข JSON ที่ถูกต้องและใช้งานง่ายเช่น

jj -p # for reading from STDIN

หรือ

jj -p -i input.json

มันเป็น (2018) ยังค่อนข้างใหม่ดังนั้นอาจจะไม่จัดการ JSON ที่ไม่ถูกต้องตามที่คุณคาดหวัง แต่ติดตั้งง่ายบนแพลตฟอร์มหลัก



16

bat คือ catโคลนที่มีการเน้นไวยากรณ์:

ตัวอย่าง:

echo '{"bignum":1e1000}' | bat -p -l json

-pจะส่งออกโดยไม่มีส่วนหัวและ-lจะระบุภาษาอย่างชัดเจน

มันมีสีและการจัดรูปแบบ JSON และไม่ได้มีปัญหาในการตั้งข้อสังเกตในความคิดเห็นนี้: ฉันจะสวยพิมพ์ JSON ในสคริปต์เปลือกหรือไม่?


12

ติดตั้งเครื่องมือ yajl ด้วยคำสั่งด้านล่าง:

sudo apt-get install yajl-tools

แล้ว

echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat


น่ากลัว ไม่ต้องการภาษาอื่น / ล่ามและอยู่ในแพคเกจ repo ไม่จำเป็นต้องชง!
โจเซฟ Lust
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.