كيف يمكنني طباعة JSON في نص برمجي صغير؟
unix command-line (20)
هل هناك برنامج نصي shell (Unix) لتنسيق JSON في نموذج قابل للقراءة من قبل الإنسان؟
في الأساس ، أريد أن أحول ما يلي:
{ "foo": "lorem", "bar": "ipsum" }
... إلى شيء من هذا القبيل:
{
"foo": "lorem",
"bar": "ipsum"
}
فانيلا باش
برنامج نصي بسيط لـ 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
باستخدام 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
عادة ما أفعل فقط:
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 الذكي" المتاحة. ينتج عنه إخراج أكثر قابلية للقراءة وأكثر مطولاً من معظم الخيارات الأخرى هنا.
هذا ما تبدو عليه "المساحة البيضاء الذكية":
قد أكون متحيزًا بعض الشيء ، ولكنها أداة رائعة لطباعة بيانات 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
}