jq (لغة برمجة)

jq هي أداة سطر أوامر شائعة الاستخدام ، ولغة برمجة وظيفية عالية المستوى ومتخصصة في معالجة بيانات JSON . تقوم jq بتصفية بيانات الإدخال لإنتاج مخرجات مُعدّلة بطريقة مشابهة لـ AWK أو sed . يتكون الإدخال عادةً من قيمة JSON واحدة أو أكثر، ولكن قد يتكون أيضًا من سطر نصي واحد أو أكثر. في jq، تتكون البرامج من مرشحات يمكن تجميعها في مسارات تُنفّذ عمليات متنوعة على مدخلاتها. [ 3 ] [ 4 ]

تاريخ

تم إنشاء jq بواسطة ستيفن دولان، وتم إصداره في أكتوبر 2012. [ 5 ] [ 6 ] ووُصف بأنه "يشبه sed لبيانات JSON". [ 7 ] تمت إضافة دعم التعبيرات النمطية في الإصدار 1.5 من jq.

كان التنفيذ الأصلي لـ jq مكتوبًا بلغة Haskell [ 8 ] قبل نقله إلى لغة C.

تم تطبيق لغة jq لاحقًا في لغات برمجة أخرى:

  • gojq [ 9 ] هو تطبيق مكتوب بلغة Go ؛
  • jaq [ 10 ] هو تطبيق مع بعض الاختلافات في لغة Rust ؛
  • يقوم jqjq [ 11 ] بتنفيذ مجموعة فرعية كبيرة من jq في jq نفسه.

يستخدم

استخدام سطر الأوامر

يُستخدم jq عادةً في سطر الأوامر، ويمكن استخدامه مع أدوات سطر الأوامر الأخرى، مثل GNU Wget . إليك مثال يوضح كيفية wgetتوجيه مخرجات أمر ما إلى مرشح jq لتحديد أسماء الفئات المرتبطة بصفحة ويكيبيديا هذه :

$ wget -qO- 'https://en.wikipedia.org/w/api.php?action=parse&page=jq_(programming_language)&format=json' | jq '.parse.categories[].”*"'

يتكون الناتج الذي تنتجه هذه السلسلة من سلسلة من سلاسل JSON، وأولى هذه السلاسل هي:

"CS1_errors:_missing_title" "CS1_errors:_bare_URL" "Articles_with_short_description" "Short_description_matches_Wikidata" "Official_website_not_in_Wikidata" "Dynamically_typed_programming_languages" "Functional_languages" "Programming_languages" "Programming_languages_created_in_2012" "Query_languages" "2012_software" "Articles_with_example_code"

يستخدم الأمر wgetأعلاه واجهة برمجة تطبيقات MediaWiki لهذه الصفحة لإنتاج استجابة JSON. تسمح الأنبوبة بالوصول إلى |مخرجات الأمر بواسطة jq، وهي آلية قياسية في أنظمة يونكس . [ 12 ]wget

مرشح jq الموضح هو اختصار لخط أنابيب jq:

.["parse"] | .["categories"] | .[] | .["*"] 

يتوافق هذا مع بنية JSON المتداخلة الناتجة عن استدعاء الدالة wget. لاحظ أن مسار jq يتم إنشاؤه بنفس الطريقة باستخدام الحرف |المستخدم في مسار Unix.

الاستخدام المدمج

يوفر jq واجهة برمجة تطبيقات C ، libjq، مما يسمح باستخدامه من C. [ 4 ]

أنماط التشغيل

يعمل jq افتراضيًا كمحرر تدفق لمدخلات JSON، تمامًا كما يمكن اعتبار أداة sed بمثابة محرر تدفق لأسطر النصوص. ومع ذلك، يمتلك jq عدة أوضاع تشغيل أخرى:

  1. يمكنه التعامل مع مدخلاته من مصدر واحد أو أكثر على أنها سطور نصية؛
  2. يمكنه جمع تدفق من المدخلات من مصدر محدد في مصفوفة JSON؛
  3. يمكنه تحليل مدخلات JSON الخاصة به باستخدام ما يسمى "محلل التدفق" الذي ينتج دفقًا من مصفوفات [المسار، القيمة] لجميع المسارات "الورقية".

يُعدّ محلل البيانات المتدفقة مفيدًا للغاية عندما يكون أحد مدخلات JSON أو أكثر كبيرًا جدًا بحيث لا يتسع في الذاكرة، نظرًا لأن احتياجاته من الذاكرة عادةً ما تكون صغيرة جدًا. على سبيل المثال، بالنسبة لمصفوفة كبيرة جدًا من كائنات JSON، فإن ذروة الحاجة إلى الذاكرة لا تتجاوز ما هو مطلوب لمعالجة أكبر كائن في المستوى الأعلى.

يمكن الجمع بين أنماط التشغيل هذه، ضمن حدود معينة.

بناء الجملة والدلالات

الأنواع

كل قيمة JSON هي أيضاً قيمة في jq، والتي بالتالي لها أنواع البيانات الموضحة في الجدول أدناه. [ 4 ]

أنواع jq المدعومة ، ملخص
يكتبأمثلة
" رقم "
  • 3
  • 3.2
  • 1e6
  • nan
  • infinite
"خيط"
  • "Hello"
  • "😐"
"منطقي"
  • true
  • false
"مصفوفة"
  • [1,"2",{"mixed":"type"},[3,4]]
"هدف"
  • {"one":1,"two":"2","three":[3]}
"باطل"
  • null

nullهي قيمة، تمامًا مثل أي قيمة عددية أخرى في JSON؛ إنها ليست مؤشرًا أو " مؤشرًا فارغًا ". nan(المقابلة لـ NaN ) و infinite(انظر IEEE 754 ) هما القيمتان العدديتان الوحيدتان في jq اللتان ليستا أيضًا قيم JSON.

النماذج

توجد أشكال نحوية خاصة لإنشاء الدوال، والشروط، وتقليل التدفق، ونظام الوحدات.

الفلاتر

فيما يلي مثال على تعريف مُرشِّح مُسمّى ومُعَامَل لتنسيق عدد صحيح في أي أساس من 2 إلى 36 شاملًا. يوضح هذا التطبيق البرمجة الضمنية (أو البرمجة بدون نقاط) :

دالة tobase($b): def digit: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[.:.+1]; def mod: . % $b; def div: ((. - mod) / $b); def digits: recurse( select(. >= $b) | div) | mod ; select(2 <= $b and $b <= 36) | [أرقام | رقم] | عكس | إضافة؛ 

يوضح المثال التالي استخدام المولدات في لعبة الحساب اللفظي الكلاسيكية "أرسل المزيد من المال" :

دالة إرسال المزيد من المال: دالة اختيار(م؛ن؛المستخدم): ([نطاق(م؛ن+1)] - المستخدم)[]; def num(a;b;c;d): 1000*a + 100*b + 10*c + d; def num(a;b;c;d;e): 10*num(a;b;c;d) + e; أولاً( 1 كـ $m | 0 كـ $o | اختر(8؛9؛[]) كـ $s | اختر(2؛9؛[$s]) كـ $e | اختر(2؛9؛[$s،$e]) كـ $n | اختر(2؛9؛[$s،$e،$n]) كـ $d | اختر(2؛9؛[$s،$e،$n،$d]) كـ $r | اختر(2؛9؛[$s،$e،$n،$d،$r]) كـ $y | select(num($s;$e;$n;$d) + num($m;$o;$r;$e) == num($m;$o;$n;$e;$y)) | [$s,$e,$n,$d,$m,$o,$r,$e,$m,$o,$n,$e,$y] ); 

لقد ألهم برنامج jq العديد من البرامج المقلدة والمشابهة.

يعيد gojq تنفيذ الكثير من وظائف jq في لغة Go . [ 13 ] كما يدعم معالجة ملفات YAML .

jaq هو تطبيق مكتوب بلغة Rust لـ jq تم تطويره باستخدام دلالات توضيحية لإضفاء الطابع الرسمي على سلوكه في الحالات التي تكون فيها وثائق jq الأصلية غير واضحة أو لا تتطابق مع سلوكه. [ 13 ]

برنامج yq لمايك فرح هو برنامج شبيه بـ jq يدعم العديد من تنسيقات الملفات، بما في ذلك JSON وYAML وXML. [ 14 ] ولا يتوافق تركيبه النحوي تمامًا مع jq. [ 13 ]

يوفر برنامج yq الخاص بأندريه كيسليوك مجموعة من البرامج النصية الوسيطة التي تستخدم jq لمعالجة ملفات YAML أو XML أو TOML . [ 15 ] [ 16 ]

ملحوظات

  1. يشمل، على سبيل المثال لا الحصر.

مراجع

فهرس

آحرون

  1. https://github.com/jqlang/jq .{{cite web}}: مفقود أو فارغ |title=( مساعدة )
  2. ١ ٢ "تنزيل jq" . jq . مؤرشف من الأصل في ١٠ سبتمبر ٢٠٢٥. تم الاسترجاع في ٢٧ سبتمبر ٢٠٢٥ .
  3. هومر، مايكل (19 أكتوبر 2023). تحويلات البيانات التركيبية المتفرعة في jq، بصريًا . وقائع ورشة العمل الدولية الثانية لـ ACM SIGPLAN حول تجريدات البرمجة والرموز التفاعلية والأدوات والبيئات . نيويورك: رابطة آلات الحوسبة. الصفحات 11-16 . doi : 10.1145/3623504.3623567 . ISBN  9798400703997تم الاطلاع عليه بتاريخ 27 سبتمبر 2025 .
  4. 1 2 3 "دليل jq 1.8" . jq . مؤرشف من الأصل بتاريخ 16 سبتمبر 2025. تم الاطلاع عليه بتاريخ 27 سبتمبر 2025 .
  5. جانسينز 2014 .
  6. "jqlang" . GitHub . تم الاسترجاع في 6 يناير 2023 .
  7. "مثل sed" . مؤرشف من الأصل بتاريخ 14-04-2013.
  8. "Initial: jqlang/Jq@eca89ac" . GitHub : jqlang .
  9. "الإصدار v0.0.1 · itchyny/gojq" . GitHub .
  10. "01mf02/jaq: نسخة من jq تركز على الدقة والسرعة والبساطة" . GitHub . تم الاطلاع عليه في 6 مارس 2024 .
  11. ^ وادمان ماتياس (2022). "jqjq: تنفيذ jq لـ jq" . جيثب . جيثب، وشركة . تم الاسترجاع في 22 يناير 2026 .
  12. "Tutorial" . jq . تم الاطلاع عليه في 6 يناير 2023 .
  13. 1 2 3 فاربر، مايكل (2023). "الدلالات التفسيرية ومترجم سريع لـ jq". arXiv : 2302.10576 [ cs.LO ].
  14. فرح، مايك. "yq" . yq . مؤرشف من الأصل في 20 أغسطس 2025. تم الاسترجاع في 27 سبتمبر 2025 .
  15. آشر، بن (9 يناير 2022). "الاستعلام عن JSON وXML باستخدام jq وxq" . آشبي . مؤرشف من الأصل في 29 أبريل 2025. تم الاسترجاع في 27 سبتمبر 2025 .
  16. أندريه، كيسليوك. "yq: معالج YAML/XML/TOML عبر سطر الأوامر - غلاف jq لمستندات YAML وXML وTOML" . وثائق yq . مؤرشف من الأصل في 26 أغسطس 2025. تم الاطلاع عليه في 27 سبتمبر 2025 .