शेल स्क्रिप्ट में मैं JSON को कैसे प्रिंट कर सकता हूं?


3060

क्या JSON को मानव-पठनीय रूप में प्रारूपित करने के लिए एक (यूनिक्स) शेल स्क्रिप्ट है?

मूल रूप से, मैं चाहता हूं कि यह निम्नलिखित को रूपांतरित करे:

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

... कुछ इस तरह से:

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


7
मैंने अपना संक्षिप्त समय वापस ले लिया: github.com/exhuma/braindump/tree/master/jsonformat यह कोड बहुत ही सरल है, अजगर की अपनी jsonलाइब्रेरी का उपयोग करते हुए , लेकिन मैंने सिंटिलेशन हाइलाइटिंग प्राप्त करने के लिए पाइनेस भी जोड़ा।
प्रात: 9:30

इस पर ठोकर खाई, लेकिन फिर जसन प्रिटी को पाया और मुझे यह काफी पसंद आया। Typekit अपने एपीआई उदाहरणों में इसका उपयोग करता है, इसलिए इसके पीछे कुछ klout है ^ ^
Nick Tomlin

यदि आपको चिपकाने की नकल करने में कोई आपत्ति नहीं है, तो jsonprettyprint.net जैसे ऑनलाइन कुछ सरल टूल भी हैं जहाँ आप अपने कच्चे JSON को जल्दी प्रिंट कर सकते हैं।
जावाया

7
सावधान रहें: पायथन एम-जोंस.टूल हमेशा वैध JSON का उत्पादन नहीं करता है। (संकेत: 1e1000)
पीक

जवाबों:


4459

पायथन 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"}'


72
आप pygmentize -l javascriptअपनी कमांड लाइन में सिंटैक्स रंगीन आउटपुट प्राप्त करने के लिए उस पर पाइप लगा सकते हैं । संपादित करें : यदि आपके पास pyolution स्थापित है जो है।
श्रीकांत शरत

177
एक महान जवाब, केवल सावधानी मैं इसके साथ है यह आउटपुट पर कुंजियों को क्रमबद्ध करता है - जिसके बारे में आपको जानकारी होनी चाहिए।
क्रिस नैश

14
MYY .vimrc में "nnoremap <F5>:% अजगर -m json.tool <सीआर>: w <सीआर>!"
imwilsonxu

40
ऐसा लगता है कि यूनिकोड वर्णों को \ uXXXX में बचाना चाहिए, जो कि एक नुकसान हो सकता है।
user1071136

13
मैंने एक उपनाम बनाया है: alias pretty='python -mjson.tool | pygmentize -l jsonताकि मैं बस चला सकूं command params | pretty:। उम्मीद है की यह मदद करेगा। पुनश्च: क्या किसी को इसे विस्तारित करने के लिए प्रबंधित करना चाहिए) कर्ल-आउटपुट को हटा रहा हूं जिसे मैं हर बार देख रहा हूं और / या b) json कुंजियों को क्रमबद्ध नहीं करता; कृपया मुझे बताएं, मैं बहुत आभारी रहूंगा।
क्लिंट ईस्टवुड

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विकल्प भी है , जो कुछ मामलों में सहायक है।
मैथ्यू फ्लैशेन

9
कर्ल के साथ काम करना:curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
होवर रुआन

19
"जक।" एक सुंदर-प्रिंटर के रूप में महान है, लेकिन यह एक चेतावनी के साथ आता है: jq (ऊपर और jq संस्करण 1.5 सहित) बहुत बड़े और बहुत छोटी संख्याओं के मूल्यों को बदल देगा क्योंकि यह IEEE 754 64-बिट मानों के रूप में संख्यात्मक मानों को पार्स करता है। यह जांचने के लिए कि आपके पसंदीदा सुंदर-प्रिंटर में एक ही मुद्दा है, इस मान को आज़माएं: 1e1000। ध्यान दें कि अजगर -mjson.tool इस परीक्षण को बुरी तरह से विफल कर देता है कि यह इन्फिनिटी पैदा करता है, जो कि JSON भी नहीं है।
पीक

1
नोट के रूप में, आप स्वरूपित परिणाम को एक फ़ाइल में पुनर्निर्देशित कर सकते हैं echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile:।
चाड

26
@ मीकोही विकल्प "गूंज का अनावश्यक उपयोग" है। सुपर <<<ऑपरेटर को पाकर खुश था - ठीक उसी तरह जो मैं देख रहा था।
२०

381

मैं JSON.stringifyजावास्क्रिप्ट में JSON को सुंदर प्रिंट करने के लिए "स्पेस" तर्क का उपयोग करता हूं ।

उदाहरण:

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

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

Node.js के साथ यूनिक्स कमांड-लाइन से, कमांड लाइन पर JSON निर्दिष्ट करना:

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

यह दिखाता है:

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

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 में ऑब्जेक्ट डीबग करने के लिए, आपको वास्तव में JSON.stringify () के बजाय sys.inspect () का उपयोग करना चाहिए। यहाँ क्यों है: markhansen.co.nz/inspecting-with-json-stringify
गुरपताप सिंह

11
Downvoted। ओपी एक "* निक्स कमांड-लाइन स्क्रिप्ट" के बारे में है और यह उत्तर एक अलग संदर्भ है।
danorton 14

49
@danorton: JS को कमांडलाइन से नोड.जेएस और अन्य समान समाधानों के माध्यम से उपयोग किया जा सकता है।
कैल्विनफ सेप

10
कंसोल के लिए कोई ज़रूरत नहीं है: node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"परिणाम को STDOUT के लिए भी आउटपुट करता है।
जूलियन डी।

2
यह बेकार है कि स्क्रिप्ट एक फ़ाइल नाम बनाम स्टड के लिए अलग है
लुकाज़ विकटोर

340

मैंने एक उपकरण लिखा है जिसमें सबसे अच्छा "स्मार्ट व्हाट्सएप" फॉर्मेटर्स उपलब्ध है। यह अन्य विकल्पों में से अधिकांश की तुलना में अधिक पठनीय और कम वाचाल आउटपुट उत्पन्न करता है।

अंडरस्कोर-CLI

यह "स्मार्ट व्हाट्सएप" जैसा दिखता है:

मैं थोड़ा पक्षपाती हो सकता हूं, लेकिन कमांड लाइन से JSON डेटा को प्रिंट और हेरफेर करने के लिए यह एक बढ़िया उपकरण है। यह उपयोग करने के लिए सुपर-अनुकूल है और इसमें व्यापक कमांड-लाइन मदद / प्रलेखन है। यह स्विस आर्मी चाकू है जिसका उपयोग मैं 1001 विभिन्न छोटे कार्यों के लिए करता हूं जो किसी अन्य तरीके से करने के लिए आश्चर्यजनक रूप से कष्टप्रद होंगे।

नवीनतम उपयोग-मामला: क्रोम, देव कंसोल, नेटवर्क टैब, सभी को HAR फ़ाइल के रूप में निर्यात करें, "cat site.har | underscore select '.url' --outfmt text | 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' अब मैं बस कर्ल कर सकता हूं example.com/result.json | अंडरस्कोर और अभी भी अन्य स्वरूपण के लिए अंडरस्कोर का उपयोग करें
गैल ब्राचा

धन्यवाद डेव! उपकरण अच्छा है! उर्फ सुंदर-जोसन = "अंडरस्कोर सुंदर" और कर्ल आउटपुट एक आंख को प्रसन्न करता है
मैक्सिम

महान स्वरूपण उपकरण, सिर्फ एक नोट: फ़ाइल में आउटपुट अग्रेषित करना (या -o विकल्प या > के साथ ) केवल अंडरस्कोर प्रिंट के साथ काम करता है । अंडरस्कोर सुंदर रंग स्वरूपण संकेत डाला जा रहा है के साथ एक फ़ाइल बचाता है, ख़ाली की तरह: [32m, [33m, [39mउनमें से प्रत्येक से पहले कुछ प्रिंट न हो सकने है, जो मान्य JSON नहीं करता है के साथ। हालाँकि, अंडरस्कोर प्रिंट अकेले एक फ़ाइल में कुछ भी नहीं जोड़ता है और यह पूरी तरह से प्रारूपण का काम करता है।
तियूरिन

मैं प्यार करता हूँ jqलेकिन यह मेरे "JSON" के लिए बहुत अच्छा काम करता है जिसमें दोहरी उद्धृत कुंजियाँ नहीं थीं।
Bluu

@DaveDopson महान उपकरण के लिए धन्यवाद !! गोसन ने इसे jsonselect.org/#tryit के साथ इस्तेमाल करने की कोशिश की ...
mycargus

173

मैं आमतौर पर बस:

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

और चुनिंदा डेटा प्राप्त करने के लिए (इस मामले में, "परीक्षण" का मूल्य):

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

अगर जीसस को सीधे आने वाला माना जाए तो http एपीआई भी एक अच्छा उपकरण है जिसे अजगर में लागू किया गया है: github.com/jkbr/httpie
फ्लोरियन

यदि आपके पास नोड स्थापित है (और YAML स्टाइल आउटपुट को बुरा मत मानना) तो यह पैकेज भी है: rafeca.com/prettyjson ताकि आप एक कर्ल को समाप्त कर सकें | prettyjson
Iolo

3
जैसा कि ऊपर उल्लेख किया गया है, एक JSON सुंदर प्रिंटर के रूप में python -mjson.tool के साथ समस्याओं में से एक यह है कि यह हमेशा JSON का उत्सर्जन नहीं करता है। जैसे 1e1000 इन्फिनिटी बन जाता है (चाहे अजगर 2.x या 3.x का उपयोग कर)। 'जक।' हमेशा 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
गैब जॉनसन

1
और @ icktoofay की टिप्पणी, इस तरह आयात OrderedDict साथ छँटाई से बचने के लिए: from collections import OrderedDict
ह्यूगो

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=(',', ': '))" ध्यान दें कि अनुगामी व्हाट्सएप को
blindsnowbobile

महान स्निपेट! मैंने 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(फिल्टर के बिना .) भी काम करता है। (ubuntu / linux; प्लेटफॉर्म भर में ymmv)
माइकल

73

पर्ल के साथ, CPAN मॉड्यूल का उपयोग करें 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। "पीपी" "शुद्ध पर्ल" के लिए है - उपकरण केवल पर्ल में लागू किया जाता है, बाहरी सी लाइब्रेरी के लिए बाध्य किए बिना (जो कि एक्सएस के लिए खड़ा है, पर्ल का "एक्सटेंशन सिस्टम")।


9
Cygwin के साथ आने के लिए मानक लगता है!
Janus Troelsen

12
json_pp को उसी तरह से उपयोग किया जा सकता है और यह संभवतः आपके सिस्टम पर आसानी से स्थापित है (डेबियन पर यह 'पर्ल' पैकेज में है)।
मिकिबेल

8
FYI करें, मेरे Mac OS X 10.9 सिस्टम पर, json_pp अपने आप उपलब्ध है।
ग्रीग विलियम्स

-t nullमुझे अशक्त कर दिया : एक मान्य टोफ़ॉर्मैट नहीं ... लेकिन इसे छोड़ना शानदार ढंग से काम किया। धन्यवाद।
लुकास

पीपी शुद्ध पर्ल के लिए है, यहाँ सुंदर प्रिंट नहीं है :) चूँकि json_xs और json_pp केवल सुंदर प्रिंट से अधिक कर सकते हैं और -json_opt के अलावा अन्य चीजें भी सुंदर छपाई के बजाय कर सकते हैं। हालांकि सुंदर मुद्रण डिफ़ॉल्ट व्यवहार है।
Kjetil S.

70

* निक्स पर, स्टडिन से पढ़ना और स्टडआउट के लिए लिखना बेहतर काम करता है:

#!/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)

इसे अपने PATH और इसे में एक फ़ाइल (मैंने अपने नाम “prettyJSON” के नाम AnC के उत्तर में रखा) chmod +x, और आप जाने के लिए अच्छे हैं।


दरअसल, स्टडिन / स्टडआउट का उपयोग करना अधिक लचीला और सरल है। इस पर ध्यान दिलाने के लिए धन्यवाद।
AC

3
नामांकित फ़ाइल की अपेक्षा करने वाले कार्यक्रमों के लिए, आउट / इरिटेशन के लिए / dev / stdin, ditto का उपयोग करें।
21

4
fileinput.input()अगर कोई कमांड-लाइन में दी गई फाइलें नहीं हैं तो FYI स्टड से पढ़ता है। उदाहरण
jfs

fileinput.input () अंत में बिना किसी नई लाइन वाली फाइलों के साथ अच्छी तरह से व्यवहार नहीं कर सकता, पिछली बार जब मैंने जाँच की थी।
ज़चारी वेंस

वह शेल लिपि में पूछते हैं, अन्य भाषा में नहीं। JQ के साथ यह पूरी तरह से कर सकते हैं।
बुई अन्ह

65

JSON रूबी जेम को पटकने के लिए एक शेल स्क्रिप्ट के साथ बंडल किया गया है:

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

स्क्रिप्ट डाउनलोड: gist.github.com/3738968


6
ध्यान दें कि इस समाधान के साथ पायथन एक के विपरीत यूनिकोड "\ uxxxx" एस्केप सीक्वेंस को डिकोड किया जाता है json.tool। हालाँकि, यह भी लगता है कि घोंसले की गहराई सीमाएं ( nesting of 20 is too deep (JSON::NestingError)) हैं।
a3nm

2
उबंटू पर आप कर सकते हैं: sudo apt-get install ruby-json-pureइसके बजायgem install
Janus Troelsen

1
`` `eric-mbp: ~ ericstob $ sudo gem स्थापित करें json पासवर्ड: Fetching: json-1.7.3.gem (100%) देशी एक्सटेंशन का निर्माण। इसमें कुछ समय लग सकता है ... सफलतापूर्वक स्थापित किया गया json-1.7.3 1 मणि स्थापित json-1.7.3 के लिए री प्रलेखन स्थापित करना ... json-1.7.3 के लिए RDoc प्रलेखन स्थापित करना ... eric-mbp: ~ ericstob $ prettst_json .rb -bash: prettify_json.rb: कमांड नहीं मिली
एरिक हार्टफोर्ड

शायद आप अपनी सामग्री पोस्ट कर सकते हैं prettify_json.rb?
एंड्रयू

आप स्क्रिप्ट डाउनलोड करें, अपने में ले जा सकते ~/binफ़ोल्डर का नाम बदलें (यकीन है कि यह अपने पथ में है बनाने के) prettify_json.rbके लिए ppjऔर रन chmod +x ppj। अब आप कुछ ऐसा कर सकते हैंcurl www.jsonsring.com/something.json | ppj
उरी

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
मैंने एक बड़ी फ़ाइल (> 60MB) के खिलाफ jsonpp (पिछले सफल में प्रयुक्त) की कोशिश की। मैंने 5min के बाद इसे बंद कर दिया। मैं इस पर पहुंचाया python -mjson.tool(अन्य जवाब यहाँ से) और यह 10-20sec ... ले लिया
वोल्कर

60MB का JSON? वाह! मैं आम तौर पर उन फाइलों से नहीं निपटता जो बड़े लेकिन उपयोगी हैं। धन्यवाद।
जोर्डेल

मेरे ubuntu बॉक्स पर मेरे पास एक है json_pp- जो अच्छी तरह से प्रारूप json करता है, हालांकि नामकरण में समानता के बावजूद, मेरा मानना ​​है कि यह jsonppयहां उल्लेख से पूरी तरह से अलग परियोजना है
davidpricedev

56

मैं इसे कैसे करता हूं:

curl yourUri | json_pp

यह कोड को छोटा करता है और काम पूरा करता है।


3
उबंटू सर्वर: यदि आपके पास बहुत प्रतिबंधित स्थापनाओं के साथ उत्पादन मशीनें हैं, तो यह सबसे अच्छा विकल्प हो सकता है क्योंकि यह एक विशिष्ट नाम के तहत डिफ़ॉल्ट रूप से स्थापित है। अजगर अक्सर संस्करण के आधार पर अलग-अलग तरीकों से स्थापित किया जाता है (जैसे python3, python या बिल्कुल नहीं)।
जोनाथनो

55

सुंदर जोंस प्रिंटिंग के लिए एक सरल बैश स्क्रिप्ट

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
प्रतिक्रिया के लिए धन्यवाद। मैंने अभी इस स्क्रिप्ट को व्यक्तिगत उपयोग के लिए लिखा था और इसने मेरे मामलों में ठीक काम किया। मैंने सुधार किया, अब यह छोटा है और इस समस्या के बिना। पूरी तरह से प्रारूप का समर्थन करने के लिए एक लक्ष्य नहीं है, लेकिन यदि आवश्यक हो तो मैं अन्य सुधार कर सकता हूं।
एवगेनी कारपोव

2
यह केवल काम कर रहा है जवाब मुझे मिला। मेरे पास एक एम्बेडेड linux है - कोई रूबी, कोई जावास्क्रिप्ट, कोई भी इंटरनेट का उपयोग करने के लिए अजगर मॉड्यूल डाउनलोड नहीं करता है ... मेरे पास थोड़ा अलग awk है जो %*cसंकेतन का समर्थन नहीं करता है इसलिए मैंने इसे बदल दिया printfहै c=0; while (c++<offset) printf " "; printf $0;। और मेरे awk में अलग-अलग rexx बच रहे हैं और बैकस्लैश काम नहीं करता है []। मैंने रीगेक्स को बदल दिया /^[[{]/और /[]}]/
Zaboj Campula

2
यह स्वीकार किया जाना चाहिए, क्योंकि यह पूर्ण देशी है और इसके लिए तीसरे पक्ष के सॉफ़्टवेयर की आवश्यकता नहीं है ...
Blag

1
@EvgenyKarpov अच्छा कैच, फुल रोलबैक की जरूरत नहीं, बस grepगलती से मिट गया;)
Blag

1
धन्यवाद दोस्त, मैं एक 8MB वन-लाइनर जोंस को नंगे सरल बैश में प्रारूपित करने का एक त्वरित तरीका चाहता था।
अहमद एम

53

कोशिश करो pjson। इसके रंग हैं!

गूंज '{"json": "obj"} |  pjson

इसे स्थापित करें pip:

⚡ pip install pjson

और फिर किसी भी JSON सामग्री को पाइप करें pjson


इसके लिए अजगर-पाइप (sudo apt-get install python-pip) और उसके बाद (sudo pip install pjson) की आवश्यकता होती है!
क्रिस्टजान अडोजान

1
नुकसान यह है कि रंगीन आउटपुट को टटोलना संभव नहीं है।
१२:०४ पर क्रिस्टजान अडोजान

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

नोट: यह ऐसा करने का तरीका नहीं है।

पर्ल में समान:

$ 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"
}

यदि आपकी पाइपलाइन का शेष भाग सुंदर रूप से यूनिकोड को संभाल लेगा और आप चाहेंगे कि आपका 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

पायथन उदाहरण को सरल बनाया जा सकता है। JSON आउटपुट को सीधे पाइप में करना बहुत आसान है python -m json.tool
डेन लोवेनहर्ज़

@ दान: हाँ। और कई उत्तर हैं जो json.toolकोड उदाहरण दिखाते हैं। 1. यह संस्करण आपको कुछ मापदंडों को बदलने की अनुमति देता है जैसे, indent2. पोस्टिंग के समय (2008) पायथन 2.4 अभी भी इस्तेमाल किया गया था जो समर्थन नहीं करता है-mjson.tool
jfs

40

मैं jshon का उपयोग ठीक उसी तरह से करता हूँ जैसा आप कर रहे हैं। बस दौडो:

echo $COMPACTED_JSON_TEXT | jshon

आप JSON डेटा को रूपांतरित करने के लिए तर्क भी पास कर सकते हैं।


धन्यवाद, jshon एक ही कार्य के लिए अजगर या रूबी का उपयोग करने से बहुत तेज है
अलेक्जेंडर

2
@ अलेक्जेंडर - आपको कितनी तेज़ प्रिंटर चाहिए? मैं OSx Lion पर हूँ जो कि पायथन प्रीइंस्टॉल्ड के साथ आता है। Python -mjson.tool के साथ, मैं 0.1 के दशक में 96KB json फाइल को प्रिंट कर सकता हूं - Earthporn का json आउटपुट जो कि jshon लिंक के बारे में 24KB है और मैं 0.08 में प्रिंट कर सकता हूं। आपके लिए कितना तेज है jshon?
जॉन्सन

1
मैं 1 + GB संपीड़ित (जो भी बड़ी असम्पीडित है) JSON डेटा फ़ाइलों के साथ काम कर रहा हूं, इसलिए मैं सुझाव की बहुत सराहना करता हूं कि jshon तेज है।
रयान बैलेन्टिन

38

या, रूबी के साथ:

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

जो मुझे एक त्रुटि देता है। क्या आपको कुछ माणिक जसन पैकेज स्थापित करने की आवश्यकता है?
12

3
हां, आपको JSON रूबी रत्न की आवश्यकता है: sudo gem install json
darscan

@MatSchaffer ध्यान दें कि यदि आप JSON का उपयोग कस्टम to_jsonतरीकों से वस्तुओं को क्रमबद्ध करने के लिए कर रहे हैं तो यह काम नहीं करता है ; Kernel#jjकेवल सुंदर-प्रिंट एरे और उसी (या संख्या / तार / बूलियन) के हैश।
फ्रॉग्ज

विंडोज पर, यह कोशिश करें: echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
रॉस एट्रील

36

की जाँच करें Jazor । यह एक साधारण कमांड लाइन JSON पार्सर है जिसे रूबी में लिखा गया है।

gem install jazor
jazor --help

4
क्या यह सिर्फ मैं या यह एकमात्र सुझाव है जो वास्तव में ओपी के सवाल का जवाब देता है? मैं यहां एक साधारण कमांड की तलाश में आया था जिसमें मैं इसका आउटपुट पाइप कर सकता था curlऔर यह एकमात्र ऐसा है जिसने मेरे लिए यह किया।
सिंह कैसरानी

2
मुझे यह पसंद है कि इसमें आउटपुट को रंगीन करने का विकल्प है। इसे पढ़ने में आसान बनाता है।
एंड्रयू

ओह, मुझे एक url पास करने का विकल्प भी पसंद है क्योंकि मैं अपने REST API के उत्पादन को देखने के लिए इसका उपयोग कर रहा हूँ
एंड्रयू

35

परिणाम प्राप्त करने के लिए आप इस सरल कमांड का उपयोग कर सकते हैं:

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

मेरी राय में सबसे अच्छा जवाब। छोटे और याद रखने में आसान और किसी भी गैर-मानक उपकरण को स्थापित करने की आवश्यकता नहीं है।
यूजीन सी

python -m json.tool JSON ऑब्जेक्ट के ऑर्डर को संरक्षित नहीं करता है।
पुशऑनपॉप

31

JSONLint का GitHub पर एक ओपन-सोर्स कार्यान्वयन है जिसे कमांड लाइन पर उपयोग किया जा सकता है या Node.s प्रोजेक्ट में शामिल किया जा सकता है।

npm install jsonlint -g

और फिर

jsonlint -p myfile.json

या

curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less

28

बस करने के लिए उत्पादन पाइप jq .

उदाहरण:

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

अच्छा उत्तर @Ackshaey Singh और कोई भी आसानी से फ़ाइल में समान रूप से निर्देशन कर सकता है। जैसेcat <file_name.txt> | jq . > <output_name.txt>
प्रमित

9
brew install jqअगर आपके मैक ओएस पर हैं।
Distwo

1
दुर्भाग्य से, jq .सुंदर-छपाई के लिए उपयोग करने में एक संभावित खामी है: जेसीएन नंबर को IEEE नंबर के रूप में मानने के लिए jq के सभी अतिरिक्त संस्करण जोर देते हैं, इसलिए परिशुद्धता बहुत बड़े पूर्णांकों के लिए आसानी से खो जाती है, जैसे।
चोटी

2
@ प्रमित cat file |वास्तव में एक प्रक्रिया की बर्बादी है; बस करो jq . <file_name.txt >output_name.txt(शाब्दिक <और >पात्रों के साथ)।
मार्क रीड

24

Pygmentize

मैं पायथन के साथ पायथन के json.tool को जोड़ती हूं:

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

Pyactize करने के लिए कुछ विकल्प हैं जो में सूचीबद्ध हैं मेरे इस उत्तर

यहाँ एक लाइव डेमो है:

डेमो


5
कभी-कभी किसी को pygmentize -l jsonकोलोर्फ़िकेशन प्राप्त करने के लिए उपयोग करने की आवश्यकता होती है।
जेपी

उपयुक्त पैकेज के साथ स्थापित करें python-pygments, अर्थात्apt-get install python-pygments
जन

23

पर्ल के साथ, यदि आप JSON :: CPAN से PP स्थापित करते हैं, तो आपको json_pp कमांड मिलेगी । चोरी उदाहरण से बी Bycroft आपको मिलता है:

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

यह ध्यान देने योग्य है कि json_ppउबंटू 12.04 (कम से कम) और डेबियन इन के साथ पहले से इंस्टॉल आता है/usr/bin/json_pp


19

मैं json_xs कमांड लाइन उपयोगिता का उपयोग करने की सलाह देता हूं जो JSON :: XS पर्ल मॉड्यूल में शामिल है। JSON :: XS, JSON को सीरीज़ / डीरसाइज़ करने के लिए एक पर्ल मॉड्यूल है, डेबियन या उबंटू मशीन पर आप इसे इस तरह इंस्टॉल कर सकते हैं:

sudo apt-get install libjson-xs-perl

यह जाहिर तौर पर CPAN पर भी उपलब्ध है ।

URL से प्राप्त JSON को प्रारूपित करने के लिए इसका उपयोग करने के लिए आप इस तरह कर्ल या विग का उपयोग कर सकते हैं:

$ 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

दोनों निम्नलिखित की तरह उत्पादन को बेहतर बनाएंगे (jq और भी रंगीन):

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

Jq का बहुत बड़ा फायदा यह है कि यदि आप पार्स करना चाहते हैं और json को प्रोसेस करना चाहते हैं तो यह A LOT अधिक कर सकता है।


json_pp मेरे मैक पर था - लेकिन jq नहीं। धन्यवाद!
डेविड एच।

1
@ दाविद - क्या यह मदद करता है: stackoverflow.com/questions/37668134/…
10

धन्यवाद! पहले कभी जेक के बारे में नहीं सुना था।
डेविड एच।

17

jj सुपर-फास्ट है, आर्थिक रूप से अच्छे JSON दस्तावेजों को संभाल सकता है, वैध 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-tools स्थापित करें:

sudo apt-get install yajl-tools

फिर,

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


बहुत बढ़िया। दूसरी भाषा / दुभाषिया की आवश्यकता नहीं है और पैकेज रेपो में है, काढ़ा करने की आवश्यकता नहीं है!
जोसेफ लस्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.