كيف يمكنني طباعة JSON في نص برمجي صغير؟




unix command-line (20)

هل هناك برنامج نصي shell (Unix) لتنسيق JSON في نموذج قابل للقراءة من قبل الإنسان؟

في الأساس ، أريد أن أحول ما يلي:

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

... إلى شيء من هذا القبيل:

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

Pygmentize

أنا أضم json.tool بايثون مع pygmentize:

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

هناك بعض البدائل ل pygmentize التي ترد في هذه الإجابة .

هنا عرض حي:


فانيلا باش

برنامج نصي بسيط لـ Bash ( grep / awk ) لطباعة 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}'

أمثلة:

1) قراءة الملف وطباعة جميلة في وحدة التحكم

cat file.json | json_pretty.sh

2) الاستخدام مع النوافذ GIT Bash من ملف إلى ملف (UTF8):

cat fileIn.json |sh.exe json_pretty.sh > fileOut.json

أستخدم jshon ما تصفه بالضبط. فقط قم بتشغيل:

echo $COMPACTED_JSON_TEXT | jshon

يمكنك أيضًا تمرير الوسيطات لتحويل بيانات JSON.


أستخدم الوسيطة "space" لـ 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');

من سطر أوامر Unix مع nodejs ، حدد 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));\
 });\
"

أوصي باستخدام الأداة المساعدة لسطر الأوامر json_xs المتضمنة في وحدة JSON :: XS perl. JSON :: XS هي وحدة بيرل لإجراء تسلسل / إلغاء تسلسل 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

إذا كنت تستخدم npm و Node.js ، فيمكنك إجراء npm install -g json ثم توجيه الأمر عبر json . هل json -h للحصول على جميع الخيارات. يمكن أيضًا سحب حقول محددة وتهيئة الإخراج باستخدام -i .

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

انها ليست بسيطة جدا مع طريقة الأم مع أدوات jq .

فمثلا:

cat xxx | jq .

باستخدام Perl ، استخدم الوحدة النمطية 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 . "pp" هو "perl perly" - يتم تنفيذ الأداة في Perl فقط ، بدون ربط لمكتبة C خارجية (وهو ما يمثله XS ، "نظام الإضافة" Perl).


بفضل النصائح المفيدة للغاية لـ JF Sebastian ، إليك برنامج نصي مُحسّن قليلاً لقد توصلت إلى:

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

تثبيت yajl-tools باستخدام الأمر أدناه:

sudo apt-get install yajl-tools

ثم،

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


حاول pjson . لديها الألوان!

تثبيته مع pip :

⚡ pip install pjson

ثم توجيه أي محتوى JSON إلى pjson .


عادة ما أفعل فقط:

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

لقد كتبت أداة تحتوي على أحد أفضل التنسيقات "whitespace الذكي" المتاحة. ينتج عنه إخراج أكثر قابلية للقراءة وأكثر مطولاً من معظم الخيارات الأخرى هنا.

underscore-cli

هذا ما تبدو عليه "المساحة البيضاء الذكية":

قد أكون متحيزًا بعض الشيء ، ولكنها أداة رائعة لطباعة بيانات JSON ومعالجتها من سطر الأوامر. إنه سهل الاستخدام للغاية ولديه وثائق / وثائق مساعدة شاملة في سطر الأوامر. إنها سكين الجيش السويسري التي أستخدمها في 1001 مهام صغيرة مختلفة من شأنها أن تكون مزعجة بشكل مفاجئ للقيام بأي طريقة أخرى.

أحدث حالة استخدام: Chrome ، وحدة تحكم Dev ، علامة تبويب الشبكة ، تصدير كل كملف HAR ، "cat site.har | underders select" .url '--outfmt text | grep mydomain "؛ الآن لدي قائمة مرتبة ترتيبًا زمنيًا لجميع عمليات جلب عناوين URL التي تم إجراؤها أثناء تحميل موقع شركتي.

الطباعة الجميلة هي سهلة:

underscore -i data.json print

نفس الشيء:

cat data.json | underscore print

نفس الشيء ، أكثر وضوحا:

cat data.json | underscore print --outfmt pretty

هذه الأداة هي مشروع شغفي الحالي ، لذلك إذا كانت لديك أي طلبات مميزة ، فهناك فرصة جيدة للتغلب عليها.


مع Perl ، إذا قمت بتثبيت JSON::PP من CPAN ، فستحصل على الأمر json_pp . سرقة example من B Bycroft تحصل عليه:

[[email protected] ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

من الجدير بالذكر أن json_pp يأتي مثبتًا مسبقًا مع Ubuntu 12.04 (على الأقل) وديبيان في /usr/bin/json_pp


هكذا أفعل ذلك:

gem install jazor
jazor --help

إنه يقصر التعليمات البرمجية وينجز المهمة.


يتم تضمين JSON Ruby Gem مع نص برمجي shell لإضفاء الطابع الشخصي على JSON:

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

تنزيل البرنامج النصي: gist.github.com/3738968


JSONLint لديه تطبيق مفتوح المصدر على جيثب يمكن استخدامها على سطر الأوامر أو المدرجة في مشروع node.js.

npm install jsonlint -g

وثم

jsonlint -p myfile.json

أو

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

yajl لطيفة جدا ، في تجربتي. json_reformat أمر json_reformat الخاص به لطباعة ملفات .json في vim عن طريق وضع السطر التالي في ملفي .vimrc :

autocmd FileType json setlocal equalprg=json_reformat

UPDATE أستخدم 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 .


أنا أستخدم httpie

$ pip install httpie

ويمكنك استخدامه على هذا النحو

 $ http PUT localhost:8001/api/v1/ports/my 
 HTTP/1.1 200 OK
 Connection: keep-alive
 Content-Length: 93
 Content-Type: application/json
 Date: Fri, 06 Mar 2015 02:46:41 GMT
 Server: nginx/1.4.6 (Ubuntu)
 X-Powered-By: HHVM/3.5.1

 {
     "data": [], 
     "message": "Failed to manage ports in 'my'. Request body is empty", 
     "success": false
 }




pretty-print