عارض JSON في Bash — jless & JQ_COLORS
استخدم مُجمِّل JSON المجاني مباشرةً في متصفحك — لا حاجة للتثبيت.
جرّب مُجمِّل JSON أونلاين ←عندما تحتاج إلى عارض JSON في bash للاستكشاف التفاعلي بدلاً من البرمجة النصية، يقصر الأسلوب المعياري jq . — تتمرر المخرجات إلى أعلى الطرفية ولا توجد طريقة للتنقل عبر استجابة API مكونة من 300 سطر. يغطي هذا الدليل الأدوات المصممة خصيصاً لعرض JSON بشكل تفاعلي في الطرفية: jless (شجرة قابلة للطي مع التنقل بمفاتيح vim)، JQ_COLORS لنظم الألوان المخصصة، jq -C | less -R للتصفح الملوّن، والأسماء المستعارة في الـ shell للاستخدام اليومي، و fx كبديل Node.js. للبرمجة النصية وسير عمل CI/CD والتحقق، راجع دليل تنسيق JSON في Bash المرافق. للحصول على عارض متصفح بدون تثبيت، تعمل أداة مُجمِّل JSON فوراً. تم اختبار الأمثلة على Bash 5.x (macOS عبر Homebrew، Ubuntu 22.04+) وهي متوافقة مع Bash 3.2+ (shell النظام على macOS).
- •
jless— أفضل عارض JSON تفاعلي للطرفية: شجرة قابلة للطي، مفاتيح vim، بحث تدريجي - •
jq -C . | less -R— مُقلِّب ملوّن قابل للتمرير بدون تثبيت إضافي سوى jq - •
JQ_COLORS— متغير بيئة يخصص نظام ألوان ANSI لـ jq لكل نوع JSON - •
fx— عارض JSON تفاعلي مبني على Node.js مع دعم الماوس وتعبيرات JavaScript - •
alias jv='jless'— أمر من كلمة واحدة يجعل العرض التفاعلي عادة يومية
العرض التفاعلي مقابل العرض البرمجي لـ JSON
تمرير JSON إلى jq . هو الخيار الصحيح عندما تريد مخرجات منسقة لحمولة صغيرة، أو عندما تُغذّي النتيجة أمراً آخر. لكنه الخيار الخاطئ عندما تحتاج إلى استكشاف استجابة API مكونة من 200 حقل — تطير المخرجات عبر نافذة الطرفية وتتركك بدون طريقة للتنقل أو طي الأقسام أو البحث عن حقل محدد دون إعادة تشغيل الأمر بمرشح. تعرض عارضات JSON التفاعلية نفس المخرجات المنسقة والملونة داخل مُقلِّب ثابت حيث تتحكم في التنقل. البيانات متطابقة؛ الفرق هو الواجهة.
# jless — opens an interactive pager, nothing scrolls off curl -s https://api.github.com/users/torvalds | jless # Full document visible, collapsible, searchable with j/k/h/l
# jq . — output scrolls off screen for large responses curl -s https://api.github.com/users/torvalds | jq . # 300+ lines scroll past — you lose context immediately
jq مع مرشحات صريحة ومعالجة رمز الخروج. يغطي دليل تنسيق JSON في Bash تلك الأنماط البرمجية.jless — العارض التفاعلي لـ JSON
jless هو عارض JSON مخصص للطرفية. على عكس أنبوب jq البسيط، يعرض المستند كشجرة ثابتة قابلة للطي: يمكن توسيع أو طي كل كائن ومصفوفة بشكل مستقل باستخدام l و h، يستخدم التنقل مفاتيح vim، والبحث التدريجي يعثر على أي مفتاح أو قيمة فوراً. يُدفق المدخلات بشكل تدريجي، لذا يفتح الملفات الكبيرة واستجابات API في أقل من ثانية بغض النظر عن الحجم — حيث يخزن jq المستند بأكمله مؤقتاً قبل عرض أي شيء. أصل إلى jless كأداة أولى كلما كانت استجابة API كبيرة جداً للمسح دفعة واحدة.
التثبيت
# macOS brew install jless # Linux — prebuilt binary from GitHub Releases curl -sL https://github.com/PaulJuliusMartinez/jless/releases/latest/download/jless-x86_64-unknown-linux-gnu.tar.gz \ | tar xz sudo mv jless /usr/local/bin/ # Verify jless --version
الاستخدام الأساسي
# Open a local file — interactive tree viewer launches immediately jless api-response.json # Pipe any JSON stream directly into jless curl -s https://api.github.com/users/torvalds | jless # Open with all nodes collapsed to top level (useful starting point for large documents) jless --mode line api-response.json # Load a specific array element and view it in isolation jq '.[0]' deployments.json | jless
التنقل والبحث في التطبيق العملي
# Inside jless: # # j / ↓ move down # k / ↑ move up # l / → expand node (or Enter) # h / ← collapse node # H collapse current + all siblings → high-level overview # L expand everything recursively # # / start forward search — type a key name and press Enter # n / N next / previous search match # # g / gg jump to start # G jump to end # q quit
مرجع اختصارات لوحة مفاتيح jless
جميع الاختصارات متاحة فور فتح jless — لا يلزم أي تكوين. نموذج التنقل متطابق عمداً مع vim حتى تنتقل الذاكرة العضلية الحالية بسلاسة.
jq -C | less -R — التصفح الملوّن بدون أدوات إضافية
إذا لم يكن jless مثبتاً وتحتاج إلى عرض ملوّن قابل للتمرير لاستجابة JSON، jq -C . | less -R هو بديل قادر. يُجبر العلم -C رموز الألوان ANSI حتى عندما يكون stdout أنبوباً (عادةً يُزيلها jq)، و -R يخبر less بتصيير تلك الرموز بدلاً من طباعتها كنص حرفي. النتيجة مستند ملوّن بالكامل وقابل للتمرير — بدون بنية الشجرة التفاعلية لـ jless. يستخدم التنقل داخل less مفاتيح الأسهم أو مفاتيح vim j/k، و / يُشغّل بحث النص المدمج في less.
# Basic colorized pager jq -C . response.json | less -R # From a curl response — -s prevents progress bar from corrupting the JSON stream curl -s https://api.github.com/repos/jqlang/jq | jq -C . | less -R # Sort keys for easier visual scanning, then page jq -CS . config.json | less -R # -C = force color, -S = sort keys (both flags combined) # Add an alias so you never have to type the full pipe again alias jqv='jq -C . | less -R' # Usage: cat response.json | jqv # or: curl -s https://api.example.com/status | jqv
jq -C | less -R يخزن المخرجات المنسقة بالكامل مؤقتاً قبل أن يتمكن less من عرضها. على ملف بحجم 200 ميغابايت هذا يعني الانتظار عدة ثوانٍ واستهلاك ذاكرة كبيرة — نفس القيد مثل jq . البسيط. للملفات الكبيرة، استخدم jless بدلاً من ذلك لأنه يُدفق بشكل تدريجي.JQ_COLORS — نظم الألوان المخصصة
JQ_COLORS هو متغير بيئة يُجاوز نظام ألوان ANSI الافتراضي لـ jq. يأخذ سلسلة مفصولة بنقطتين من سبعة رموز سمة ANSI؛لون، رمز واحد لكل نوع JSON بهذا الترتيب الثابت: null : false : true : أرقام : نصوص : مصفوفات : كائنات. كل رمز بتنسيق سمة;لون حيث السمة هي 0 (عادي)، 1 (غامق)، 2 (خافت)، أو 4 (مسطّر)، واللون هو رقم لون ANSI قياسي (30–37 = قياسي، 90–97 = ساطع).
# ANSI color reference for building JQ_COLORS: # Attributes: 0=normal 1=bold 2=dim 4=underline # Colors: 30=black 31=red 32=green 33=yellow # 34=blue 35=magenta 36=cyan 37=white # Bright: 90=bright-black 91=bright-red 92=bright-green 93=bright-yellow # 94=bright-blue 95=bright-magenta 96=bright-cyan 97=bright-white # # Order: null : false : true : numbers : strings : arrays : objects # High-contrast theme for dark terminals (recommended) export JQ_COLORS="1;30:0;91:0;92:0;93:0;32:1;96:1;96" # null=dim-gray, false=bright-red, true=bright-green, # numbers=bright-yellow, strings=green, arrays=bold-cyan, objects=bold-cyan # Solarized-style theme export JQ_COLORS="2;37:0;35:0;35:0;36:0;33:1;34:1;34" # null=dim-white, false=magenta, true=magenta, # numbers=cyan, strings=yellow, arrays=bold-blue, objects=bold-blue # Minimal (bold keys only, everything else plain) export JQ_COLORS="0;90:0;39:0;39:0;39:0;39:1;39:1;39"
# Add your chosen theme to ~/.bashrc or ~/.zshrc so it applies to every jq call
echo 'export JQ_COLORS="1;30:0;91:0;92:0;93:0;32:1;96:1;96"' >> ~/.bashrc
source ~/.bashrc
# Test the theme
echo '{"active":true,"errors":null,"count":42,"tags":["api","v2"],"meta":{"version":"1.0"}}' | jq .JQ_COLORS على سبعة قيم مفصولة بنقطتين بالضبط. إذا كان للسلسلة عدد أقل من الشرائح، يعود jq بصمت إلى إعداداته المدمجة الافتراضية بدون أي رسالة خطأ — مما يجعل التكوين الخاطئ صعب التشخيص. اختبر دائماً سلسلة ألوان جديدة على حمولة JSON قصيرة قبل إضافتها إلى ملف تعريف shell.الأسماء المستعارة في Shell لعرض JSON اليومي
أوامر العرض التفاعلي لـ JSON مطوّلة بشكل افتراضي. مجموعة صغيرة من الأسماء المستعارة في ~/.bashrc أو ~/.zshrc تجعل jless والتصفح الملوّن أوامر بكلمة واحدة تندمج بشكل طبيعي في أي سير عمل. الأسماء المستعارة أدناه قابلة للتركيب — كل من jv و jvp تقبل مدخلات مُمرّرة أو اسم ملف كأول وسيطة.
# Add to ~/.bashrc or ~/.zshrc
# jv — interactive viewer (jless if available, colorized pager fallback)
jv() {
if command -v jless &>/dev/null; then
jless "$@"
else
jq -C . "$@" | less -R
fi
}
# jvp — view with keys sorted alphabetically (useful for comparing responses)
alias jvp='jq -CS . | less -R'
# jvc — view from clipboard (macOS)
alias jvc='pbpaste | jless'
# jvf — view and filter: jvf '.users[0]' response.json
jvf() {
local filter="$1"; shift
jq -C "$filter" "$@" | less -R
}
# Reload without restarting terminal
source ~/.bashrc# Usage examples after adding aliases above # View any file or piped response jv deployment-config.json curl -s https://api.github.com/users/torvalds | jv # View sorted (easy to scan alphabetically) cat feature-flags.json | jvp # Drill into a sub-document interactively jvf '.database' infra/app-config.json jvf '.users[] | select(.role == "admin")' users.json
bat — عرض ملفات JSON مع تمييز الصياغة
bat هو بديل لـ cat مع تمييز الصياغة وأرقام الأسطر ومُقلِّب مدمج. بالنسبة لملفات JSON على القرص توفر تجربة قراءة نظيفة بأسلوب المحرر بدون فتح محرر نصوص كامل. على عكس jless، يُصيّر bat الملف كنص ثابت — لا طي، لا بحث، لا تنقل غير التمرير. قوته في الوضوح البصري للملفات الثابتة متوسطة الحجم (ملفات التكوين، البيانات الثابتة، حمولات الاختبار) حيث تريد ألوان الصياغة وأرقام الأسطر لكنك لا تحتاج إلى تنقل تفاعلي في الشجرة.
# macOS brew install bat # Debian / Ubuntu (binary may be named batcat) apt-get install -y bat # alias bat=batcat # add to ~/.bashrc if needed on Ubuntu # View a JSON file with syntax highlighting and line numbers bat config/feature-flags.json # Disable pager — print directly to terminal (useful in scripts) bat --paging=never api-response.json # Combine with jq: format with jq, view with bat (preserves bat's JSON highlighting) jq '.' response.json | bat --language=json --paging=never
bat لقراءة ملفات التكوين الثابتة وبيانات الاختبار الثابتة حيث تهم أرقام الأسطر (مثلاً عندما يُشير فشل اختبار إلى السطر 47 من ملف بيانات ثابت). لاستجابات API وJSON الديناميكي من curl، jless أسرع في الفتح وأكثر عملية في التنقل. إذا كنت بحاجة إلى العرض في المتصفح ومشاركته مع زميل، الصقه مباشرةً في أداة مُجمِّل JSON — لا طرفية مطلوبة.fx — مستكشف JSON التفاعلي على Node.js
fx هو عارض JSON تفاعلي مبني على Node.js. واجهته مشابهة لـ jless — شجرة قابلة للطي، تنقل بلوحة المفاتيح، بحث — لكنه يضيف ميزتين تفتقر إليهما jless: دعم الماوس (النقر للتوسيع/الطي) والقدرة على كتابة تعبير JavaScript في الشريط السفلي لتصفية المستند في الوقت الفعلي. للفرق التي تشغّل Node.js بالفعل، fx مناسب طبيعياً ولا يتطلب ملفاً ثنائياً منفصلاً. للبيئات الطرفية البحتة بدون Node، jless هو الاختيار الأخف.
# Install globally via npm npm install -g fx # Or run without installing (npx caches the package) curl -s https://api.github.com/users/torvalds | npx fx # Basic interactive use fx api-response.json curl -s https://api.github.com/repos/jqlang/jq | fx # In fx: arrow keys navigate, Enter expands/collapses, / searches # Bottom bar accepts JavaScript expressions for live filtering: # .name → show only the "name" field # .repos.slice(0,5) → first 5 repos
# fx also works as a non-interactive formatter (like jq . but with JS syntax)
# Pass a JavaScript expression as argument — no interactive mode
echo '{"users":[{"id":1,"name":"Sarah Chen"},{"id":2,"name":"Marcus Osei"}]}' \
| fx '.users[0].name'
# Sarah Chen
# Chain with map for array transformations
cat deployments.json | fx '.items.map(d => ({id: d.deploy_id, status: d.state}))'الأخطاء الشائعة
تظهر هذه الأخطاء الأربعة بشكل متكرر عندما يبدأ المطورون في استخدام عارضات JSON للطرفية لأول مرة — لكل خطأ حل واضح بمجرد فهم سبب حدوثه.
المشكلة: يُفرغ jq . جميع المخرجات إلى stdout دفعة واحدة. بالنسبة للاستجابات الأطول من ارتفاع الطرفية، كل شيء فوق آخر شاشة يختفي — لا يمكنك التمرير للخلف إلى البداية أو التنقل إلى حقل محدد.
الحل: مرّر إلى jless للتنقل التفاعلي، أو استخدم jq -C . | less -R كبديل. كلاهما يُبقي المستند الكامل متاحاً بغض النظر عن حجمه.
# Full document stays accessible in jless — nothing is lost curl -s https://api.github.com/users/torvalds | jless # j/k to scroll, h/l to collapse/expand, / to search
# 300-line API response — top 280 lines immediately scroll off curl -s https://api.github.com/users/torvalds | jq . # Only the bottom of the output is visible — cannot navigate back
المشكلة: يتطلب JQ_COLORS بالضبط سبع قيم مفصولة بنقطتين. إذا كان للسلسلة ست أو ثماني قيم، يتجاهل jq المتغير بصمت ويعود إلى إعداداته الافتراضية المدمجة — لا تحذير، لا خطأ، فقط ألوان خاطئة.
الحل: عدّ النقطتين: سلسلة JQ_COLORS صالحة تحتوي على بالضبط ست نقطتين وسبع قيم. أخرج المتغير ومرّره إلى tr للعدّ.
# Exactly 7 values — 6 colons export JQ_COLORS="1;30:0;91:0;92:0;93:0;32:1;96:1;96" # Verify the count before adding to shell profile echo "$JQ_COLORS" | tr -cd ':' | wc -c # must output 6
# Only 6 values — jq silently uses defaults, no indication of why
export JQ_COLORS="1;30:0;91:0;92:0;93:0;32:1;96"
echo '{"ok":true}' | jq . # colors unchanged — no error shownالمشكلة: يُصيّر jless وfx واجهتهما التفاعلية إلى الطرفية (TTY)، وليس إلى stdout. تمرير أيٍّ منهما إلى grep أو tee أو أي أمر آخر ينتج رموز ANSI مشوشة أو مخرجات فارغة — مخرجات العارض التفاعلية غير مصممة لاستهلاكها من قِبل برامج أخرى.
الحل: استخدم jq مع مرشح صريح لاستخراج البيانات برمجياً. استخدم jless وfx فقط كخطوة نهائية في أنبوب عندما يقرأ إنسان المخرجات.
# Use jq for programmatic extraction — clean, composable jq -r '.request_id' response.json | grep "req_" # Use jless only as the terminal endpoint — nothing after it jless response.json
# jless output is for human eyes — piping it produces garbage jless response.json | grep "request_id" # Output: ANSI escape codes and cursor sequences, not clean text
المشكلة: -C يجبر رموز ألوان ANSI في تدفق المخرجات. عندما يُطبع هذا التدفق مباشرةً على طرفية ليست في الوضع الخام — أو يُمرر إلى أداة لا تفسر ANSI — تظهر تسلسلات الهروب كأحرف حرفية مثل ^[[1;34m مما يُشوش المخرجات.
الحل: اقرن دائماً jq -C مع less -R. العلم -R يضع less في وضع الإدخال الخام، يخبره بتصيير تسلسلات ANSI كألوان بدلاً من طباعتها كنص.
# -C with -R: ANSI codes are rendered as actual colors jq -C . response.json | less -R # Output: colorized JSON, clean and readable
# -C without -R: escape sequences print as raw text jq -C . response.json | less # Output: ^[[1;34m"status"^[[0m: ^[[0;32m"ok"^[[0m ...
jless مقابل jq مقابل bat مقابل fx — مقارنة العارضات التفاعلية
تُصيّر جميع الأدوات الأربع JSON ملوّناً، لكن قدراتها التفاعلية تختلف اختلافاً كبيراً. اختر بناءً على ما إذا كنت تحتاج إلى تنقل قابل للطي أو بحث أو دعم ماوس — وما إذا كان Node.js موجوداً بالفعل في بيئتك.
في معظم الحالات: ثبّت jless مرة واحدة واستخدمه كعارض تفاعلي افتراضي. احتفظ بـ jq -C . | less -R كبديل للبيئات التي لا يمكنك فيها تثبيت ملفات ثنائية إضافية. أضف fx إذا كان فريقك يعمل بـ Node.js أولاً ويقدّر التنقل بالماوس أو التصفية المباشرة بـ JavaScript.
الأسئلة الشائعة
كيف أبحث عن مفتاح محدد داخل ملف JSON في الطرفية؟
في jless، اضغط / لفتح موجه بحث تدريجي، اكتب اسم المفتاح، ثم اضغط Enter. استخدم n للانتقال للأمام بين النتائج وN للتنقل للخلف. البحث حساس لحالة الأحرف بشكل افتراضي. في jq -C | less -R، يُشغّل / بحث less المدمج الذي يطابق النص الخام بما في ذلك رموز ألوان ANSI — بحث jless أكثر موثوقية لـ JSON المنظم.
# Open file in jless, then press / to search jless api-response.json # In jless: type / → "request_id" → Enter → n for next match # jq alternative: extract and print all matching keys to stdout jq '.. | objects | with_entries(select(.key == "request_id"))' api-response.json
كيف أتنقل في بنية JSON متداخلة بعمق باستخدام اختصارات لوحة المفاتيح؟
يحاكي jless التنقل في vim: j/k للأعلى/الأسفل، h لطي العقدة، l لتوسيعها. اضغط H لطي العقدة الحالية وجميع أشقائها دفعة واحدة — مفيد للحصول على نظرة عامة عالية المستوى قبل الغوص في فرع محدد. L يوسع كل شيء بشكل تكراري. بمجرد طي كل شيء إلى المستوى الأعلى، وسّع فقط المسار الذي تريده باستخدام l.
# Open the response in jless curl -s https://api.github.com/repos/jqlang/jq | jless # In jless: # H → collapse all top-level keys # j/k → navigate to the key you want # l → expand only that branch # gg → return to root # G → jump to last element
كيف أجعل مخرجات jq بالألوان أسهل للقراءة على طرفية داكنة؟
قم بتعيين متغير البيئة JQ_COLORS مع رموز سمة ANSI؛لون لكل نوع JSON. المواضع السبعة بالترتيب هي: null، false، true، أرقام، نصوص، مصفوفات، كائنات. ضع export في ~/.bashrc أو ~/.zshrc لتطبيقه على كل استدعاء لـ jq. الألوان الساطعة الغامقة تعمل بشكل أفضل على الخلفيات الداكنة.
# High-contrast theme for dark terminals — add to ~/.bashrc or ~/.zshrc
export JQ_COLORS="1;30:0;91:0;92:0;93:0;32:1;96:1;96"
# null=gray, false=bright-red, true=bright-green,
# numbers=bright-yellow, strings=green, arrays/objects=bright-cyan
# Test immediately without reloading shell
echo '{"active":true,"errors":0,"tags":["api","v2"]}' | jq .ما الفرق بين jless وjq . لعرض JSON؟
يقوم jq . بتمرير المخرجات إلى الطرفية دفعة واحدة. بالنسبة للاستجابات الأطول من ارتفاع الطرفية، كل شيء فوق آخر شاشة يختفي — لا يمكنك التمرير للخلف إلى البداية أو التنقل إلى حقل محدد. يعرض jless المستند بأكمله في مُقلِّب تفاعلي حيث يمكنك التمرير والبحث وطي العقد والتنقل باختصارات لوحة المفاتيح دون فقدان السياق. استخدم jq . لإلقاء نظرة سريعة على حمولة صغيرة؛ استخدم jless عندما تحتاج إلى استكشاف.
# Small payload — jq . is fine
echo '{"status":"ok","version":"2.4.1"}' | jq .
# Large or nested response — jless is better
curl -s https://api.github.com/repos/jqlang/jq | jless
# → interactive tree, no output scrolled off screenكيف أعرض استجابة JSON من curl بشكل تفاعلي في الطرفية؟
مرر curl مباشرةً إلى jless. أدرج دائماً -s (صامت) لمنع شريط تقدم curl من الظهور في المخرجات. سيفتح jless العارض التفاعلي مع الاستجابة الكاملة معروضة كشجرة قابلة للطي. إذا لم يكن jless مثبتاً، يوفر jq -C . | less -R مُقلِّباً ملوناً كبديل.
# Interactive exploration with jless curl -s https://api.github.com/users/torvalds | jless # Colorized pager fallback (no collapse, but still scrollable with color) curl -s https://api.github.com/users/torvalds | jq -C . | less -R
هل يمكنني عرض ملفات JSON متعددة جنباً إلى جنب في الطرفية؟
يفتح jless ملفاً واحداً في كل مرة. للمقارنة جنباً إلى جنب، استخدم مضاعف طرفية: tmux split-window -h يفتح انقساماً رأسياً، ثم شغّل jless في كل لوحة مع ملف مختلف. بدلاً من ذلك، استخدم أداة JSON Diff المستندة إلى المتصفح إذا كنت بحاجة إلى مقارنة وثيقتين هيكلياً.
# tmux side-by-side: split horizontally, then run jless in each pane tmux split-window -h # Left pane: jless response-v1.json # Right pane: jless response-v2.json # Or use diff on jq-normalized output for a text diff diff <(jq -S . response-v1.json) <(jq -S . response-v2.json)
أدوات ذات صلة
توفر لك أداة مُجمِّل JSON نفس العرض القابل للطي والملوّن مثل jless — مباشرةً في المتصفح، بدون تثبيت وبدون طرفية.
Cora is a platform engineer who builds developer tooling and internal platforms, using Bash as the glue that connects components written in different languages and runtimes. She writes about cross-platform shell scripting, Bash utility functions, environment management, configuration templating, and the practical shell techniques that platform engineers use to build self-service tooling for development teams.
Nadia is a site reliability engineer who lives in the terminal. She writes Bash scripts that process logs, transform data, and orchestrate infrastructure across fleets of servers. She is a heavy user of jq, awk, and sed and writes about shell one-liners, text processing pipelines, data serialisation from the command line, and the practical Bash patterns that SREs reach for when speed matters more than elegance.