انتقل إلى المحتوى

مقدمة سريعة لتحليل JSON باستخدام JSONPath في Python

أصبح JSON هو المعيار الفعلي لتبادل البيانات على الويب. تستخدم واجهات برمجة التطبيقات وخدمات الويب ومواقع الويب الحديثة JSON على نطاق واسع لإرسال البيانات بين الخوادم والعملاء.

على سبيل المثال، وفقًا لـBuiltWith، يستخدم أكثر من 70% من أفضل 10,000 موقع ويب واجهات برمجة تطبيقات JSON. من السهل إنشاء تنسيق JSON وتحليله بأي لغة برمجة.

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

مشكلة تحليل JSON

تقليديًا، تتم معالجة بيانات JSON في التطبيقات عن طريق تحليلها بالكامل إلى هياكل بيانات أصلية مثل تعليمات Python. يمكنك تحليل استجابة JSON بالكامل حتى لو كنت تحتاج فقط إلى مجموعة فرعية صغيرة من البيانات.

هذا النهج له بعض السلبيات:

  • بطء الأداء - يعد تحليل ملفات JSON الكبيرة إلى كائنات أمرًا مكلفًا من الناحية الحسابية
  • ارتفاع استخدام الذاكرة - يجب الاحتفاظ ببنية JSON بأكملها في الذاكرة
  • كود مطول - غالبًا ما يتعين عليك كتابة الكثير من تعليمات التكرار/الاجتياز للبحث في الكائنات التي تم تحليلها

البديل هو استخدام التعبيرات العادية لاستخراج أجزاء JSON المطابقة مباشرة. ومع ذلك، يصبح التعبير العادي فوضويًا مع الهياكل المتداخلة المعقدة. كما أنه يعاني من أسماء المفاتيح الديناميكية أو أعماق التداخل العشوائية.

يوفر JSONPath طريقة أكثر وضوحًا وإيجازًا للاستعلام عن JSON مقارنةً بالتحليل الأولي أو مطابقة التعبير العادي.

تقديم JSONPath

تصف تعبيرات JSONPath كيفية الوصول إلى أجزاء من مستند JSON. إنه مشابه من الناحية المفاهيمية لـ XPath الذي يسمح بالاستعلام عن العناصر والسمات في XML:

//node/child::*  - XPath for all child nodes
$.node.child     - Equivalent JSONPath 

بعض مزايا نهج JSONPath:

  • قراءة - تعبيرات الاستعلام سهلة الفهم
  • إيجاز - لا حاجة لكود الاجتياز المطول
  • مرونة - يدعم عمليات البحث والمرشحات ومطابقات أحرف البدل
  • الأداء - خوارزميات مطابقة محسنة للغاية
  • التدرجية – يمكن معالجة حتى مستندات JSON الضخمة بسرعة

يوفر JSONPath بديلاً بسيطًا وقابلاً للتطوير لاستخراج البيانات من JSON. بعد ذلك، دعنا نتعرف على كيفية عمله.

الاستعلام عن JSON باستخدام JSONPath

تعبير JSONPath عبارة عن سلسلة تصف كيفية تحديد موقع القيم داخل بنية JSON. على سبيل المثال:

data = {
  "store": {
    "books": [
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      }
    ]
  }
}

# All book titles
books = jsonpath(data, ‘$.store.books[*].title‘) 

# Filter fiction books 
fiction_books = jsonpath(data, ‘$.store.books[?(@.category=="fiction")].title‘)

يستخدم JSONPath عوامل تشغيل مثل:

  • . – عامل الطفل
  • [] - مشغل منخفض للوصول إلى الصفيف
  • * - حرف البدل لجميع العناصر المطابقة
  • ?() - تصفية المسندات

يتيح ربط هذه العناصر معًا إمكانية الاستعلام بكفاءة إلى JSON المعقد:

# Get all authors of books over 10 dollars 
authors = jsonpath(data, ‘$.store.books[?(@.price > 10)].author‘)

لا مزيد من التعليمات البرمجية الحلقية المتداخلة العميقة! يقوم JSONPath بمطابقة الكائنات مباشرة دون الحاجة إلى تحليل شجرة JSON بالكامل.

مشغلي JSONPath المتاحة

فيما يلي ملخص للعوامل المتوفرة في JSONPath:

مشغلي المسار

  • $ - الكائن الجذر
  • @ - الكائن الحالي
  • . or [] – عامل الطفل
  • .. - البحث بشكل متكرر أحفاد

مشغلي التصفية

  • [?(<expression>)]– تصفية الكائنات
  • [(<condition>)]- تصفية على أساس الحالة

عوامل صفيف

  • * - يقوم Wildcard بفهرسة جميع العناصر
  • [<index>] - موضع الفهرس
  • [start:end] - شريحة المصفوفة
  • [?(<condition>)] - منقي

مشغلي الإسقاط

  • [] - الإسقاط - مقتطفات الخصائص المدرجة
  • [@] - إسقاط الفهرس - تسطيح المصفوفات

المشغلين الآخرين

  • | - مشغل الاتحاد
  • () – مشغل الأولوية
  • , - يحدد نتائج متعددة

تمنحك هذه المرونة الواسعة للاستعلام عن بيانات JSON وتصفيتها وتحويلها باستخدام سلاسل مسار بسيطة.

JSONPath مقابل XPath لـ XML

نظرًا لأن JSONPath يشترك في العديد من أوجه التشابه مع XPath، فمن المفيد مقارنة الاثنين:

كسباث

  • لغة الاستعلام لـ XML
  • يسمح بعبور شجرة XML
  • يدعم المحاور المتقدمة مثل //, /*, //@
  • يستخدم لاستخراج عقد XML

JSONPath

  • لغة الاستعلام المكافئة لـ JSON
  • بناء الجملة مستوحى من XPath
  • بناء الجملة الأبسط مثل JSON أبسط من الناحية التمثيلية من XML
  • تنفيذ سريع حيث لا حاجة إلى تحليل XML

كلاهما يسمح باختيار العقد في هياكل البيانات الهرمية. يمكن اعتبار JSONPath إصدارًا مبسطًا من XPath المخصص لـ JSON بدلاً من XML.

تم تنفيذ JSONPath للعديد من لغات البرمجة. بعض المكتبات الشائعة لبايثون هي:

المكتبةالوصف
jsonpath-ngمكتبة موصى بها وسريعة مع الميزات المتقدمة
jsonpath-rwالتنفيذ المرجعي المتوافق
com.jsonpathتنفيذ بسيط ولكن ميزات محدودة

بالنسبة لمعظم الاستخدامات ، jsonpath-ng يوفر أفضل مزيج من الامتثال والميزات والأداء.

دعنا نتعرف على كيفية استخدامه بمزيد من التفاصيل.

الاستعلام والتصفية باستخدام jsonpath-ng

أولاً، قم بتثبيت jsonpath-ng:

pip install jsonpath-ng

نعم:

from jsonpath_ng import jsonpath, parse

بعض الأمثلة:

data = { "name": "John",
          "age": 30,
          "cars": [
            { "model": "BMW", "year": 2019 },
            { "model": "Tesla", "year": 2020 } 
          ]
        }

# Extract name
name = jsonpath(data, ‘$.name‘)

# Get first car 
first_car = jsonpath(data, ‘$.cars[0]‘)

# Filter Tesla cars
teslas = jsonpath(data, ‘$.cars[?(@.model=="Tesla")]‘) 

# Get all car years 
years = jsonpath(data, ‘$..cars[*].year‘)

يمكنك أيضا استخدام parse() الطريقة التي تجمع المسار للحصول على أداء أفضل:

parser = parse(‘$.cars[*].year‘)

for obj in json_data:
   years = parser.find(obj)
   print(years)

يعمل هذا بشكل أسرع عند تطبيق نفس المسار على مستندات JSON متعددة.

تصفية بيانات JSON

إحدى أقوى ميزات JSONPath هي بنية التصفية الخاصة به.

تسمح المرشحات باختيار الكائنات التي تطابق معايير محددة. على سبيل المثال:

RecentCars = jsonpath(data, ‘$.cars[?(@.year > 2015)]‘)

وهذا يحصل على سيارات أحدث من عام 2015.

يمكنك التصفية باستخدام مقارنات مثل:

  • الرياضيات: =, !=, >, <=، الخ.
  • منطقي: and, or, not
  • التعبيرات العادية: =~, !=~
  • وجود: exists(), ?()

يمكن أيضًا دمج المرشحات:

ElectricCars = jsonpath(data, 
   ‘$.cars[?(@.year > 2010 && @.model =~ "Tesla|Volt")]`
)

هذا يحصل على السيارات الكهربائية المصنوعة بعد عام 2010.

تحويل بيانات JSON

إلى جانب استخراج البيانات، يمكن لـ JSONPath تحويل كائنات JSON باستخدام عوامل تشغيل مثل:

  • [] – الإسقاط لإعادة تشكيل الأشياء
  • [@] - فهرسة الصفيف للتسطيح

على سبيل المثال، تسوية بيانات السيارة في قائمة بسيطة:

all_models = jsonpath(data, ‘$..cars[*].model‘)
all_years = jsonpath(data, ‘$..cars[*].@year‘) 

@ هل الإسقاط القائم على الفهرس.

يسمح مرشح التسلسل والإسقاطات والشرائح بإعادة هيكلة JSON برمجيًا.

الميزات المتقدمة لـ jsonpath-ng

بعض الميزات المتقدمة الإضافية التي يوفرها jsonpath-ng:

وظائف مخصصة

يمكنك تسجيل وظائف مخصصة لتوسيع JSONPath:

def format_price(x):
  return f‘${x:,.2f}‘

jsonpath.register_custom_function(format_price, ‘format‘)

prices = jsonpath(data, ‘$.prices[*].format(@)‘) 

يتيح ذلك تنفيذ تحويلات البيانات المعقدة مباشرةً ضمن تعبيرات JSONPath.

التخزين المؤقت والتحسين

يقوم jsonpath-ng بتجميع الاستعلامات وتحسين الأداء. كما أنه يدعم:

  • التخزين المؤقت للسرعة
  • مطابقة كسول لتجنب عمليات الفحص غير الضرورية
  • تحسين عائد الإخراج

لذلك فهو يعمل بشكل جيد حتى مقابل مستندات JSON الضخمة.

مشغلين إضافيين

بعض العوامل المفيدة الأخرى:

  • ?() - التحقق من الوجود
  • =~, !=~ - مطابقة ريجكس
  • in - تحتوي على شيك
  • all - محدد الكمي العالمي

طرق JSONPath

الأساليب المساعدة مثل:

  • find() - إرجاع المباريات
  • parse() - يجمع المسار

توفير واجهة برمجة تطبيقات أبسط للاستعلامات الشائعة.

استخدام JSONPath لتجريد الويب

أحد أكثر تطبيقات JSONPath فائدة هو استخراج البيانات عند تجريف الويب.

تعتمد مواقع الويب الحديثة بشكل كبير على JSON لنقل البيانات:

  • واجهات برمجة التطبيقات – JSON هو التنسيق القياسي لواجهات برمجة تطبيقات REST
  • البيانات غير المتزامنة - يتم استخدام JSON مع JavaScript لتحديثات الصفحة الديناميكية
  • البيانات التعريفية للصفحة - غالبًا ما يتم تخزين بيانات الموقع في البرامج النصية بتنسيق JSON

سيكون تحليل كل JSON يدويًا أمرًا مرهقًا. يسمح JSONPath بالاستعلام بسهولة عن الأجزاء التي تحتاجها فقط.

على سبيل المثال، إليك كيفية استخراج بيانات المنتج من صفحة التجارة الإلكترونية:

import requests
from jsonpath_ng import jsonpath, parse

# Fetch product page
url = "http://www.example.com/product/123"  
response = requests.get(url)

# Extract JSON data 
data = response.json()

# Parse out product details 
name = jsonpath(data, ‘$.product.name‘)[0]
price = jsonpath(data, ‘$.product.price‘)[0] 
image = jsonpath(data, ‘$.product.images[0]‘)

print(name, price, image)

المفتاح هو استخدام JSONPath للاستيلاء مباشرة على الحقول المطلوبة فقط بدلاً من المعالجة اليدوية.

فيما يلي بعض حالات الاستخدام الشائعة:

  • تجريف واجهة برمجة التطبيقات – استخراج البيانات من استجابات REST API
  • مواقع جافا سكريبت – كائنات الاستعلام المستخدمة من قبل الواجهات الأمامية
  • برمجة تطبيقات الجوال – تحليل بيانات JSON من حركة مرور التطبيق
  • المحتوى الديناميكي - إنشاء مجموعات البيانات من JavaScript من جانب العميل

يسمح JSONPath باستخلاص الآلاف من مستندات JSON بشكل قابل للتطوير باستخدام سلاسل مسار بسيطة.

تحليل ملفات JSON الكبيرة

على الرغم من أن JSONPath يتوسع بشكل جيد، إلا أن تحليل مستندات JSON الضخمة لا يزال يمثل تحديات:

  • استخدام الذاكرة - تحميل JSON كاملاً في الذاكرة
  • تحميل وحدة المعالجة المركزية - تحليل المستندات المعقدة يتطلب معالجًا مكثفًا
  • نقل الشبكة – المستندات الكبيرة تعني المزيد من النطاق الترددي

بعض النصائح عند العمل مع بيانات JSON الكبيرة:

  • استخدم موزعي الدفق لتجنب تحميل JSON بالكامل
  • تجميع المسارات مع parse() بدلا من إعادة التحليل
  • قم باستخراج الحقول الفعلية المطلوبة فقط بدلاً من الكائنات الكاملة
  • استعمل laziness لتجنب عمليات فحص الكائنات غير الضرورية
  • التشغيل على خوادم سحابية قوية عند التعامل مع بيانات مقياس TB+
  • توزيع التحليل عبر المجموعات للمعالجة المتوازية

في معظم الحالات، يمكن لـ JSONPath استخراج البيانات بكفاءة حتى من ملفات JSON الضخمة التي تحتوي على مئات الآلاف من السجلات عند تحسينها بشكل صحيح.

لماذا أحب استخدام JSONPath

باعتباري مهندس وكيل ذو خبرة يعمل على نطاق واسع مع بيانات JSON، إليك سبب حبي لاستخدام JSONPath:

  • بناء الجملة موجزة - تعبيرات المسار مقتضبة بشكل جميل مقارنة بكود التحليل التقليدي
  • زيادة الإنتاجية - يمكنك الاستعلام عن JSON بنفس سهولة الاستعلام عن قاعدة البيانات بفضل البنية البديهية
  • تصفية قوية - تجعل مرشحات المسند اختيار البيانات المطابقة أمرًا سهلاً
  • أداء سريع للغاية - يستخدم jsonpath-ng خوارزميات مُحسّنة للغاية أسفل الغطاء والتي تتيح استخراج البيانات بسرعة البرق حتى في مجموعات البيانات الكبيرة
  • كفاءة الذاكرة - نظرًا لأنه يقوم بتحليل JSON بشكل انتقائي، فإن مساحة الذاكرة منخفضة مقارنة بالتحليل الكامل للكائنات الأصلية
  • قوة تجريف الويب - استخراج البيانات بسهولة من واجهات برمجة التطبيقات واستجابات JavaScript هو المكان الذي يتألق فيه JSONPath

على الرغم من أن الأدوات مثل jq وgrep رائعة، إلا أنني أجد أن JSONPath أبسط وأكثر أناقة لمعظم احتياجات تحليل JSON الخاصة بي. إن دعم نظام Python البيئي مع مكتبات مثل jsonpath-ng يجعله خياري المفضل لتشريح بيانات JSON وتقطيعها.

دعم JSONPath بلغات أخرى

بينما ركزنا على بايثون، فإن JSONPath متاح عبر العديد من لغات البرمجة:

نظرًا لأن JSON هو تنسيق بيانات عالمي، فإن القدرة على الاستعلام عنه بكفاءة من أي لغة أمر مفيد. والحمد لله أن JSONPath مدعوم على نطاق واسع.

لماذا يهم JSONPath

لقد أصبح JSON سريعًا ضروريًا لواجهات برمجة تطبيقات الويب والخدمات الصغيرة وتطبيقات الواجهة الأمامية. يقدم JSONPath إمكانات استعلام شبيهة بـ XPath إلى عالم بيانات JSON.

إن وجود لغة مسار موحدة لاستخراج قيم JSON المتداخلة بسهولة له فوائد عديدة:

  • يبسط استخراج بيانات JSON عبر الأنظمة الأساسية واللغات
  • يوفر بديلاً قابلاً للقراءة لتحليل regex القبيح
  • لتمكين تجريف الويب القابل للتطوير دون الحاجة إلى تحليل الاستجابات بأكملها
  • يسمح بالتحويلات المعقدة باستخدام الإسقاطات والمرشحات
  • يفتح القدرة على الاستعلام بكفاءة عن مجموعات بيانات JSON الضخمة
  • يتناسب بشكل طبيعي مع خطوط الأنابيب جنبًا إلى جنب مع أدوات JSON الأخرى مثل jq

مع استمرار JSON في هيمنتها كتنسيق فعلي لتبادل البيانات، فإن وجود مجموعة من عوامل تشغيل JSONPath الشائعة سيساعد في ترويض تعقيد التنقل في مستندات JSON الكبيرة.

وفي الختام

يوفر JSONPath طريقة أنيقة لاستخراج القيم من بيانات JSON وتحويلها من خلال تعبيرات المسار المختصرة.

مكتبات مثل jsonpath-ng اجعل دمج JSONPath في مشاريع Python أمرًا بسيطًا.

الوجبات الرئيسية:

  • يسمح JSONPath بالاستعلام بسهولة عن بنيات JSON باستخدام "." وعوامل التشغيل "[]".
  • التصفية حسب قيم الخاصية باستخدام مقاييس المسندات بشكل جيد
  • يمكن تطبيق التحويلات باستخدام الإسقاطات وتوسيع المصفوفة
  • يتجنب JSONPath الحاجة إلى تحليل كائنات JSON بالكامل عند عملية الكشط
  • تم تصميم بناء الجملة على غرار تعبيرات XPath للاستعلام عن XML
  • مدعوم عبر العديد من لغات البرمجة

للعمل مع خدمات الويب المستندة إلى JSON، يعد JSONPath أداة لا غنى عنها لمجموعة أدوات أي مطور. يتيح لك JSONPath طرح أسئلة بسيطة والحصول على البيانات التي تحتاجها فقط من مستندات JSON المعقدة.

الوسوم (تاج):

الانضمام إلى محادثة

لن يتم نشر عنوان بريدك الإلكتروني. الحقول المشار إليها إلزامية *