מה זה jq - עיבוד JSON מהטרמינל¶
תבדקו לעצמכם אם זה מוכר - שולחים בקשת curl ל-API, ומקבלים בחזרה בלוק ענק של JSON, הכל בשורה אחת, בלי רווחים, בלי הזחה, ובלתי אפשרי לקרוא בעין. אפשר להעתיק את זה לכלי חיצוני כדי לפרמט, אבל יש דרך הרבה יותר טובה - jq. זה כלי קטן שנועד לעשות בדיוק דבר אחד, ועושה אותו טוב מאוד.
הבעיה ש-jq פותרת¶
JSON הוא הפורמט הכי נפוץ שבו APIs מחזירים מידע היום. הבעיה היא שברגע שהתשובה גדולה - עשרות או מאות שדות, מערכים מקוננים, אובייקטים בתוך אובייקטים - קריאה שלה בעין הופכת כמעט בלתי אפשרית, במיוחד בטרמינל שבו הכל מודפס כטקסט רציף אחד.
אפשר כמובן להעתיק את הפלט לכלי גרפי, אבל זה שובר את הזרימה - במיוחד כשעובדים בסביבת שרת מרוחק בלי ממשק גרפי, או בתוך סקריפט אוטומטי שצריך להמשיך לרוץ בלי התערבות ידנית. jq נותן לכם דרך לעבד JSON ישירות בטרמינל, בלי לצאת ממנו בכלל.
איך זה עובד בפועל¶
הרעיון הבסיסי הוא שmjq מקבל JSON כקלט, ומריצים עליו סינון - filter - שמגדיר בדיוק אילו חלקים מעניינים אתכם. הפילטר הכי בסיסי הוא פשוט נקודה - . - שמדפיסה בחזרה את כל ה-JSON, אבל הפעם מפורמט יפה עם הזחה וצבעים, מה שכבר לבד הופך אותו לשימושי.
משם אפשר להתקדם למשהו ממוקד יותר:
- בחירת שדה ספציפי -
.nameיחזיר רק את הערך של השדה name מהאובייקט. - מעבר על מערך -
.items[]יעבור על כל איבר במערך items ויציג כל אחד בנפרד. - שילוב של השניים -
.items[].nameיחזיר את השדה name מכל איבר במערך. - סינון לפי תנאי עם
select, למשל להציג רק פריטים שהמחיר שלהם גבוה מסכום מסוים. - בניית מבנה חדש - jq לא רק בוחר שדות, הוא גם יכול לבנות אובייקט JSON חדש לגמרי מהנתונים הקיימים, מה שמאוד שימושי כשרוצים להתאים תשובה של API אחד לפורמט שמערכת אחרת מצפה לו.
זה נראה כמו שפה קטנה משלה, וזה בדיוק מה שזה - שפת שאילתות ייעודית ל-JSON, קצת כמו שיש שפת שאילתות ייעודית לטבלאות במסדי נתונים.
השילוב עם curl¶
הכוח האמיתי של jq מתגלה כשמשלבים אותו עם curl. במקום לקבל בלוק JSON ענק ולא קריא, אפשר לצנרר - pipe - את התשובה ישירות ל-jq ולקבל בדיוק את מה שמעניין אתכם:
שורה אחת כזאת שולחת בקשה, ומחזירה רשימה נקייה של כתובות מייל, בלי צורך לגעת בכלום מעבר לטרמינל. זה בדיוק סוג הצירוף שהופך את שני הכלים לחזקים הרבה יותר ביחד מאשר כל אחד לחוד.
למה זה חוסך המון זמן בפייפליינים¶
מעבר לשימוש ידני, jq הוא כלי טבעי בתוך סקריפטים אוטומטיים ותהליכי CI/CD. רוצים לחלץ מספר גרסה מקובץ JSON כחלק מתהליך build? jq. רוצים לבדוק אם תשובת API מכילה שדה שגיאה ספציפי ולהפעיל לוגיקה בהתאם? jq. רוצים לעבד תוצאה של קריאת API ולשלוח רק חלק ממנה הלאה בפייפליין? שוב jq.
בגלל שהוא כלי שורת פקודה קטן וללא תלויות כבדות, קל מאוד להתקין אותו בכל סביבה - שרתים, מכולות Docker, ריצות CI - וזה הופך אותו לבחירה טבעית בכל מקום שבו אתם כבר משתמשים ב-curl או בכלים דומים.
למה שווה להשקיע בזה חצי שעה¶
הכלי הזה נראה קטן, ובצדק - התחביר שלו לפעמים מרגיש קצת מוזר בהתחלה, במיוחד עם מערכים מקוננים. אבל ברגע שהוא "נכנס לאצבעות", ההבדל עצום. משימה שבעבר דרשה פתיחת קובץ, חיפוש ידני, והעתקה - הופכת לשורת פקודה אחת שרצה תוך שנייה.
זה בדיוק סוג ההרגל שכדאי לבנות מוקדם, יחד עם היסודות של עבודה בטרמינל ועיבוד נתונים. אם אתם עוד בונים את הבסיס הזה, בקורס תכנות בסיסי אנחנו מלמדים גם איך לעבוד נכון עם נתונים ועם שורת הפקודה, כדי שכלים כמו jq ירגישו טבעיים במקום מפחידים.
תתקינו את jq, תריצו עליו את התשובה הבאה שאתם מקבלים מ-API, ותראו כמה יותר קל להבין מה בדיוק חזר אליכם.