کامپیوتر , مهندسی 104 بازدید

لینوکس هیچ روش داخلی برای مدیریت صحیح JSON ندارد، با این حال برخی API-ها وجود دارند که خروجی JSON ارائه می‌کنند. در این مقاله با روش کار با JSON در خط فرمان لینوکس و تجزیه آن در اسکریپت‌های Shell با کمک گرفتن از یک ابزار ساده آشنا خواهیم شد.

تجزیه JSON با jq

jq ابزاری است که می‌تواند هر چیزی را که با JSON مربوط باشد مدیریت کند. نصب آن بسیار ساده است، کافی است فایل باینری را دانلود کنید و به پوشه‌ای روی PATH انتقال دهید. به طور معمول از پوشه /usr/local/bin/ به این منظور استفاده می‌کنیم. این ابزار هیچ وابستگی ندارد و از این رو کافی است فایل دودویی آن را دانلود کنید. امکان دانلود آن برای سیستم‌های عامل ویندوز و macOS نیز وجود دارد.

برای شروع می‌توانید JSON را pipe کنید تا به صورت pretty پرینت شود. برخی API-ها، پاسخ‌های خود را minify می‌کنند تا در فضا صرفه‌جویی کنند و در نتیجه زمانی که در کنسول curl می‌کنید، با خروجی شلوغی مواجه می‌شوید:

 JSON در خط فرمان لینوکس

می‌توانید اقدام به pipe کردن این خروجی به صورت زیر به jq بکنید:

curl https://api.example.com/ | jq

اینک کد خوانا است و syntax highlighting نیز به این امر کمک مضاعف می‌کند:

 JSON در خط فرمان لینوکس

اگر به jq یک دستور بدهید از آن برای انتخاب داده‌ها از میان JSON استفاده می‌کند که کارکردی شبیه به عملگرهای sed روی متن دارد. ما از JSONPlaceholder (+) به عنوان یک API نمونه که دستورها را رویش امتحان می‌کنیم استفاده خواهیم کرد. به منظور حفظ سادگی مثال‌ها دستور curl و pipe را نمی‌‌آوریم تا همه چیز خوانا بماند. همچنین می‌توانید به یک فایل curl کنید و cat را به jq به صورت pipe ارسال کنید. اگر نمی‌خواهید هر بار که یک دستور جدید را تست می‌کنید، خروجی curl را ببینید می‌توانید از این روش کمک بگیرید.

یک علامت نقطه ساده (.) نشان‌دهنده داده‌هایی است که در jq به صورت تودرتو pipe می‌شوند. اگر می‌خواهید یک کلید را از شیئی بگیرید، می‌توانید به صورت زیر عمل کنید:

jq '.status'

این دستور را می‌توان به صورت تودرتو نیز اجرا کرد. برای مثال دستور زیر یک مقدار را در سطحی داخلی‌تر از لیست بازگشت می‌دهد:

.data.geo.host

همچنین می‌توان یک علامت سؤال برای بررسی خطا به صورت زیر اضافه کرد تا مشخص شود که این مشخصه اختیاری است:

.data.geo?.host

کار کردن با آرایه‌ها در دستور jq بسیار هیجان‌انگیز است. می‌توانید از براکت برای دریافت یک عنصر خاص آرایه استفاده کنید. برای نمونه می‌توانید نام مدخل نخست را به صورت زیر به دست آورید:

jq '. [0].name'

امکان قطعه‌بندی آرایه‌ها با استفاده از ساختار [2:5] وجود دارد و در این مورد هم می‌توان از همان ساختار علامت سؤال برای مشخصه‌های اختیاری استفاده کرد. با این حال به خاطر بسپارید که این به آن معنی نیست که یک مشخصه نامعتبر است.

با این حال معمولاً ترجیح می‌دهیم مدخل یک آرایه را بر مبنای داده‌های درون آن و نه بر اساس ترتیب آرایه بازگشت دهیم. به این منظور کل آرایه را به ابزار select ارسال می‌کنیم:

jq '. [] | select(.name | contains("Leanne"))'

این دستور آرایه را فیلتر می‌کند تا تنها شامل آیتم‌هایی باشد که تست را پاس می‌کنند. در این مورد اگر بخواهیم بررسی کنیم آیا فیلد نام شامل نام خاصی است یا نه، از یک عبارت بولی یا حتی حسابی مانند زیر استفاده می‌کنیم:

select(.count >= 2)

قالب‌بندی JSON

jq می‌تواند اقدام به ساخت JSON نیز بکند. معنی این حرف آن است که می‌توان از آن برای قالب‌بندی مجدد ورودی JSON نیز استفاده کرد. با قرار دادن شیءها درون براکت می‌توان آن‌‌ها را به صورت مقدار به گزاره‌های jq ارسال کرد. بدین ترتیب jq تنها شیء جدید را در خروجی ارائه می‌کند. به مثال زیر توجه کنید:

cat json | jq '. [0] | {name:.name, company:.company}'

خروجی‌ها به طرز زیبایی در خط فرمان ارائه می‌شوند:

 JSON در خط فرمان لینوکس

با این که این وضعیت برای جدا کردن اطلاعات مورد نیاز مفید است، اما می‌توان اشیای جدید را با استفاده از دستورهای jq نیز ساخت.

جایگزین‌های jq

اگر نمی‌خواهید از برنامه دیگری استفاده کنید، می‌توانید از چندین روش جایگزین بهره بگیرید. ساده‌ترین روش، اجرای سریع در bash است که به جای استفاده از یک زبان اسکریپت‌نویسی مانند پایتون یا جاوا اسکریپت (node) از bash برای پردازش عملی استفاده می‌شود. شما باید در عوض،‌ خروجی دستور JSON را در یک فایل pipe کنید:

curl https://api/example.com/ > json.txt

سپس آن را در یک متغیر درون اسکریپت بارگذاری می‌کنیم تا مورد استفاده قرار دهیم. همچنین می‌توانید از ابزارهای انتخاب متن ساده استفاده کنید. برای نمونه اگر صرفاً نیاز دارید یک کلید خاص را از یک پاسخ بیرون بکشید، می‌توانید از grep همراه با عبارت منظم برای انتخاب مقدار استفاده کنید:

grep "name" | sed 's/"name": "\(.*\)"/\1/'

با این حال، این کار احتمالاً با هر تغییر کوچکی در JSON ناممکن می‌شود. با ارسال آن به API کاربران، نام هر کاربر بازگشت می‌یابد، اما همراه با آن «نام کاربری» (username) که با grep تطبیق یافته و همچنین نام شرکت که دقیقاً همان کلید را دارد نیز بازگشت می‌یابد. به جز در حالتی که همه این موارد برای شما مهم باشند، باید از چیزی استفاده کنید که از ساختار JSON آگاه باشد، نه این که با آن مانند متن رفتار کنید.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

میثم لطفی (+)

«میثم لطفی» دانش‌آموخته ریاضیات و شیفته فناوری به خصوص در حوزه رایانه است. وی در حال حاضر علاوه بر پیگیری همه علاقه‌مندی‌های خود در رشته‌های برنامه‌نویسی، کپی‌رایتینگ و تولید محتوای چندرسانه‌ای، در زمینه نگارش مقالاتی با محوریت نرم‌افزار نیز با مجله فرادرس همکاری دارد.

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *