هل هناك نص (Unix) Shell لتنسيق JSON في شكل مقروء من قبل الإنسان؟
في الأساس ، أريده أن يحول ما يلي:
{ "foo": "lorem", "bar": "ipsum" }
... إلى شيء مثل هذا:
{
"foo": "lorem",
"bar": "ipsum"
}
مع 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
وسيكون متاحًا في كل مرة في Shell. استدعيه مثل prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'
.
يمكنك استخدام: jq
إنه سهل الاستخدام للغاية ويعمل بشكل رائع! يمكنه التعامل مع هياكل JSON الكبيرة جدًا ، بما في ذلك الجداول. يمكنك العثور على دروسهم هنا .
هنا مثال:
$ jq . <<< '{ "foo": "lorem", "bar": "ipsum" }'
{
"bar": "ipsum",
"foo": "lorem"
}
أو بعبارة أخرى:
$ echo '{ "foo": "lorem", "bar": "ipsum" }' | jq .
{
"bar": "ipsum",
"foo": "lorem"
}
يمكنني استخدام وسيطة "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));\
});\
"
كتبت أداة تحتوي على أحد أفضل تنسيقات "المسافة الذكية" المتاحة. إنه ينتج إخراجًا أكثر قابلية للقراءة وأقل مطول من معظم الخيارات الأخرى هنا.
هذا ما يشبه "مسافة بيضاء ذكية":
قد أكون متحيزًا بعض الشيء ، لكنه أداة رائعة لطباعة ومعالجة بيانات JSON من سطر الأوامر. إنه سهل الاستخدام ولديه تعليمات/وثائق شاملة لسطر الأوامر. إنه سكين الجيش السويسري الذي أستخدمه في 1001 من المهام الصغيرة المختلفة التي ستكون مزعجة بشكل مدهش للقيام بأي طريقة أخرى.
حالة الاستخدام الأخيرة: Chrome ، وحدة تحكم Dev ، علامة تبويب الشبكة ، تصدير الكل كملف HAR ، "cat site.har | تسطير سفلي حدد" .url "- outfmt text | grep mydomain"؛ لدي الآن قائمة مرتبة ترتيبًا زمنيًا بجميع عمليات جلب عناوين URL التي تم إجراؤها أثناء تحميل موقع شركتي.
الطباعة جميلة سهلة:
underscore -i data.json print
نفس الشيء:
cat data.json | underscore print
نفس الشيء ، أكثر وضوحا:
cat data.json | underscore print --outfmt pretty
هذه الأداة هي مشروع شغفي الحالي ، لذا إذا كان لديك أي طلبات للميزات ، فهناك فرصة جيدة لأن أتناولها.
عادة ما أفعل فقط:
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
بفضل مؤشرات J.F 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 __== "__main__":
sys.exit(not main(sys.argv))
إذا كنت تستخدم npm و Node.js ، فيمكنك تنفيذ npm install -g json
ثم توجيه الأمر عبر json
. افعل json -h
للحصول على جميع الخيارات. يمكن أيضًا سحب حقول محددة وتلوين الإخراج باستخدام -i
.
curl -s http://search.Twitter.com/search.json?q=node.js | json
في * nix ، تعمل القراءة من 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
، ومن الجيد أن تذهب.
مع 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 خالص" - يتم تطبيق الأداة في Perl فقط ، دون الربط بمكتبة خارجية C (وهو ما يشير إليه XS ، "نظام الامتداد" الخاص بـ Perl).
يتم تضمين JSON Ruby Gem مع برنامج نصي شل لتوضيح JSON:
Sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb
تنزيل البرنامج النصي: Gist.github.com/3738968
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
الخاص بك.
هكذا أفعل ذلك:
curl yourUri | json_pp
إنها تقصر الكود وتنجز المهمة.
$ 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))'
الكلمة المقروءة بشكل جيد تصبح مشفرة
{
"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"
}
أستخدم jshon للقيام بالضبط بما تصفه. مجرد تشغيل:
echo $COMPACTED_JSON_TEXT | jshon
يمكنك أيضًا تمرير الوسائط لتحويل بيانات JSON.
أو مع روبي:
echo '{ "foo": "lorem", "bar": "ipsum" }' | Ruby -r json -e 'jj JSON.parse gets'
تحقق من Jazor . إنه سطر أوامر JSON بسيط مكتوب بلغة روبي.
gem install jazor
jazor --help
ما عليك سوى توجيه الإخراج إلى jq .
.
مثال:
twurl -H ads-api.Twitter.com '.......' | jq .
JSONLint له تطبيق مفتوح المصدر على GitHub يمكن استخدامه في سطر الأوامر أو تضمينه في مشروع Node.js.
npm install jsonlint -g
وثم
jsonlint -p myfile.json
أو
curl -s "http://api.Twitter.com/1/users/show/user.json" | jsonlint | less
سيناريو باش بسيط لطباعة 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
مع Perl ، إذا قمت بتثبيت JSON :: PP من CPAN ، فستحصل على json_pp الأمر. سرقة مثال from B Bycroft ستحصل على:
[[email protected] ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
"bar" : "ipsum",
"foo" : "lorem"
}
تجدر الإشارة إلى أن json_pp
يأتي مثبتًا مسبقًا مع Ubuntu 12.04 (على الأقل) و Debian في /usr/bin/json_pp
أوصي باستخدام الأداة المساعدة لسطر الأوامر 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
jj بسرعة فائقة ، يمكنه التعامل مع مستندات JSON الضخمة اقتصاديًا ، ولا تعبث بأرقام JSON صالحة ، وسهلة الاستخدام ، على سبيل المثال.
jj -p # for reading from STDIN
أو
jj -p -i input.json
إنها (2018) لا تزال جديدة تمامًا ، لذا ربما لن تتعامل مع JSON غير الصالحة بالطريقة التي تتوقعها ، ولكن من السهل تثبيتها على المنصات الرئيسية.
يمكنك استخدام هذا الأمر البسيط لتحقيق النتيجة:
echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool
قم بتثبيت أدوات yajl بالأمر التالي:
Sudo apt-get install yajl-tools
ثم،
echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat
yajl
لطيف جدا ، في تجربتي. يمكنني استخدام أمر json_reformat
الخاص به في طباعة ملفات .json
بشكل جميل في vim
عن طريق وضع السطر التالي في .vimrc
:
autocmd FileType json setlocal equalprg=json_reformat
إصدار PHP ، إذا كان لديك PHP> = 5.4.
alias prettify_json=php -E '$o = json_decode($argn); print json_encode($o, JSON_PRETTY_PRINT);'
echo '{"a":1,"b":2}' | prettify_json
bat
هو استنساخ cat
مع تسليط الضوء على بناء الجملة:
مثال:
echo '{"bignum":1e1000}' | bat -p -l json
سيتم إخراج -p
بدون رؤوس ، وسيحدد -l
اللغة بشكل صريح.
إنه يحتوي على تلوين وتنسيق لـ JSON ويقوم لا به المشكلات المذكورة في هذا التعليق:كيف يمكنني طباعة JSON بشكل جميل في برنامج شل؟
استخدم روبي في سطر واحد:
echo '{"test":1,"test2":2}' | Ruby -e "require 'json'; puts JSON.pretty_generate(JSON.parse(STDIN.read))"
ويمكنك تعيين اسم مستعار لهذا:
alias to_j="Ruby -e \"require 'json';puts JSON.pretty_generate(JSON.parse(STDIN.read))\""
ثم يمكنك استخدامه بسهولة أكبر
echo '{"test":1,"test2":2}' | to_j
{
"test": 1,
"test2": 2
}
وإذا كنت تريد عرض JSON بالألوان ، فيمكنك تثبيت awesome_print
،
gem install awesome_print
ثم
alias to_j="Ruby -e \"require 'json';require 'awesome_print';ap JSON.parse(STDIN.read)\""
جربها!
echo '{"test":1,"test2":2, "arr":["aa","bb","cc"] }' | to_j
أنا أستخدم 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
}
هنا حل روبي أفضل من أمر جسون للتجميل. جوهرة colorful_json
جيدة إلى حد ما.
gem install colorful_json
echo '{"foo": "lorem", "bar": "ipsum"}' | cjson
{
"foo": "lorem",
"bar": "ipsum"
}
حلول J.F. Sebastian لم تنجح بالنسبة لي في Ubuntu 8.04.
هنا هو نسخة بيرل المعدلة التي تعمل مع مكتبة 1.X JSON الأقدم:
Perl -0007 -MJSON -ne 'print objToJson(jsonToObj($_, {allow_nonref=>1}), {pretty=>1}), "\n";'
$ Sudo apt-get install edit-json
$ prettify_json myfile.json
الأداة ydump
هي طابعة JSON جميلة:
$ ydump my_data.json
{
"foo": "lorem",
"bar": "ipsum"
}
أو يمكنك الأنابيب في JSON:
$ echo '{"foo": "lorem", "bar": "ipsum"}' | ydump
{
"foo": "lorem",
"bar": "ipsum"
}
ربما يكون هذا هو الحل الأقصر بصرف النظر عن استخدام أداة jq
.
هذه الأداة جزء من مكتبة yojson
لـ OCaml ، وهي موثقة هنا .
في دبيان ومشتقاته ، تحتوي الحزمة libyojson-ocaml-dev
على هذه الأداة. بدلاً من ذلك ، يمكن تثبيت yojson
عبر OPAM .
هنا هو كيفية القيام بذلك مع رائع النصي.
قم بإنشاء برنامج نصي رائع ، دعنا نقول "طباعة جميلة"
#!/usr/bin/env groovy
import groovy.json.JsonOutput
System.in.withReader { println JsonOutput.prettyPrint(it.readLine()) }
اجعل البرنامج قابل للتنفيذ:
chmod +x pretty-print
الآن من سطر الأوامر ،
echo '{"foo": "lorem", "bar": "ipsum"}' | ./pretty-print
بالنسبة إلى Node.js ، يمكنك أيضًا استخدام الوحدة النمطية "util". ويستخدم تسليط الضوء على بناء الجملة ، المسافة البادئة الذكية ، ويزيل علامات الاقتباس من المفاتيح ويجعل فقط الإخراج كما يحصل.
cat file.json | node -e "process.stdin.pipe(new require('stream').Writable({write: chunk => {console.log(require('util').inspect(JSON.parse(chunk), {depth: null, colors: true}))}}))"
سيبدو حل سطر واحد باستخدام Node.js كما يلي:
$ node -e "console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"
فمثلا:
$ cat test.json | node -e "console.log( JSON.stringify( JSON.parse(require('fs').readFileSync(0) ), 0, 1 ))"
أنا مؤلف json-liner . إنها أداة لسطر الأوامر لتحويل JSON إلى تنسيق سهل grep. جربها.
$ echo '{"a": 1, "b": 2}' | json-liner
/%a 1
/%b 2
$ echo '["foo", "bar", "baz"]' | json-liner
/@0 foo
/@1 bar
/@2 baz
إذا كان لديك Node.js مثبتًا ، يمكنك إنشاء واحدة بمفردك باستخدام سطر واحد من التعليمات البرمجية. قم بإنشاء ملف جميل:
> هيم جميلة
#!/usr/bin/env node
console.log(JSON.stringify(JSON.parse(process.argv[2]), null, 2));
إضافة إذن التنفيذ:
> chmod + x جميلة
> ./pretty '{"foo": "lorem"، "bar": "ipsum"}'
أو إذا كان ملف JSON الخاص بك في ملف:
#!/usr/bin/env node
console.log(JSON.stringify(require("./" + process.argv[2]), null, 2));
>./تفسير file.json
باستخدام JavaScript/Node.js: ألقِ نظرة على vkBeautify.js plugin ، والذي يوفر طباعة جميلة لكلا نص JSON و XML.
إنه مكتوب بلغة JavaScript بسيطة ، أقل من 1.5 كيلو بايت (مصغر) وسريع جدًا.
هنا هو رائع بطانة واحدة:
echo '{"foo": "lorem", "bar": "ipsum"}' | groovy -e 'import groovy.json.*; println JsonOutput.prettyPrint(System.in.text)'
https://github.com/aidanmelen/json_pretty_print
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import print_function
from __future__ import division
import json
import jsonschema
def _validate(data):
schema = {"$schema": "http://json-schema.org/draft-04/schema#"}
try:
jsonschema.validate(data, schema,
format_checker=jsonschema.FormatChecker())
except jsonschema.exceptions.ValidationError as ve:
sys.stderr.write("Whoops, the data you provided does not seem to be " \
"valid JSON.\n{}".format(ve))
def pprint(data, python_obj=False, **kwargs):
_validate(data)
kwargs["indent"] = kwargs.get("indent", 4)
pretty_data = json.dumps(data, **kwargs)
if python_obj:
print(pretty_data)
else:
repls = (("u'",'"'),
("'",'"'),
("None",'null'),
("True",'true'),
("False",'false'))
print(reduce(lambda a, kv: a.replace(*kv), repls, pretty_data))
gem install jsonpretty
echo '{"foo": "lorem", "bar": "ipsum"}' | jsonpretty
هذه الطريقة أيضًا " يكتشف استجابة HTTP/الرؤوس ، ويطبعها دون مساس ، ويتخطى إلى الجسم (للاستخدام مع` curl -i ') " .
يمكنك استخدام smk :
echo '{"foo": "lorem", "bar": "ipsum"}' | smk -e"JSON.stringify(JSON.parse(data), null, 4)"
على سطر واحد
echo '{"foo": "lorem", "bar": "ipsum"}' | npx smk -e"JSON.stringify(JSON.parse(data), null, 4)"
إذا كنت لا تمانع في استخدام أداة تابعة لجهة خارجية ، يمكنك ببساطة حليقة إلى jsonprettyprint.org . هذا هو الحال بالنسبة للحالة التي لا يمكنك فيها تثبيت الحزم على الجهاز.
curl -XPOST https://jsonprettyprint.org/api -d '{"user" : 1}'
تأكد أيضًا من فحص JSONFUI: عارض JSON لسطر الأوامر يدعم الطي
لم يتم تحليل ملفات JSON الخاصة بي بأي من هذه الطرق.
كانت مشكلتي مماثلة للنشرهل مصدر بيانات Google JSON غير صالح؟.
الجواب على هذا المنصب ساعدني في إيجاد حل.
يعتبر غير صالح JSON بدون مفاتيح السلسلة.
{id:'name',label:'Name',type:'string'}
لابد أن يكون:
{"id": "name", "label": "Name", "type": "string"}
يقدم هذا الرابط مقارنة شاملة لطيفة لبعض موزعي JSON المختلفين: http://deron.meranda.us/python/comparing_json_modules/basic
مما أدى بي إلى http://deron.meranda.us/python/demjson/ . أعتقد أن هذا المحلل اللغوي أكثر تسامحًا مع الأخطاء من الآخرين.
يمكنك استخدام Xidel .
Xidel هي أداة لسطر الأوامر لتنزيل واستخراج البيانات من صفحات HTML/XML أو JSON-APIs ، باستخدام قوالب CSS أو XPath 3.0 أو XQuery 3.0 أو JSONiq أو نقش. يمكنه أيضًا إنشاء مستندات XML/HTML/JSON جديدة أو محولة.
طباعة Xidel الجميلة افتراضيًا:
$ xidel -s - -e '$json' <<< '{"foo":"lorem","bar":"ipsum"}'
{
"foo": "lorem",
"bar": "ipsum"
}
أو:
$ echo '{"foo":"lorem","bar":"ipsum"}' | xidel -s - -e .
{
"foo": "lorem",
"bar": "ipsum"
}