Parse { JSON | جيسون } تحليل

\\ بسم الله نبدأ

الجُزء النَظري | Theoretical Part

مفهوم برمجي متقدم، ببساطة صيغة لتبادل البيانات يمكن استخدامها في جميع اللغات البرمجية، قبل اختراعه كان يستخدم الاكس إم إل بكثرة ولكن سهولة التعامل وسرعة القراءة والترجمة فاز بها الجيسون عن الاكس إم إل

XML vs JSON

:لنفترض لدينا منتج ”موقع“ سيكون مقسم لقسمين

القسم الأول: هو الظاهر للمستخدم او ما يعرف بالواجهة الامامية ”فرونت اند“ وتعبر عن التصاميم وطريقة إظهار البيانات

القسم الثاني: البرمجة الخلفية ”باك اند“ ستكون للسيرفر وتعامله مع قواعد البيانات

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

الفكرة من التعامل مع الجيسون هو اخذ هذه البيانات وتحويلها لاوبجكت أو عنصر للغة المُتعامل معها. طريقة كتابته بسيطة وهي تتكون من عنصرين

:العنصر الأول

key is a String دائمًا

:العنصر الثاني

value أي عنصر لغوي, Collections (Arrays, Maps), Strings, Numbers, Booleans

الجيسون تأتي بهيئة سترينق ضخم ومعقد في الاغلب، للتعامل معه لابد من فك سلسلة السترينق الى عنصر للغة وهذه العملية تسمى بـ

Deserialization | فك التسلسل

ملاحظة: الشرح كله بلغة دارت، عوافي! الأساس واحد لجميع اللغات*

الجُزء البرمجِي | Pُrogramming Part {💖}

نفترض طلبنا من السيرفر يرجع لنا المستخدمين وهذا كان الجيسون المسترد

هيكل الجيسون

هو حاليا يعتبر سترينق بنظر المترجم\الكومبايلر فلذلك لازم نحوله لعنصر مفهوم للغة لعرض او التعامل مع بياناته، بديهيًا السترينق يعتبر عنصر من اللغة ونقدر مباشرة نتعامل معه لكن الجيسون دائمًا يعبر عن محتوى يضم معلومات ضخمة مو عنصر او عنصرين بل الاف العناصر فلابد تتحول كل معلومة منه لعنصر مفهوم، نقدر نحوله حسب شكله

في حالتنا بدأ بقوس } فيُعتبر ماب ولها كي واحد كما توضح الصورة وهو

“users” => parsedJson[“users”]

ملاحظة: اذا بدأ بقوس ] فنعتبره اراي والتعامل مع الماب او الاراي متشابه الا في الوصول للعناصر، مهم معرفة الفرق بينهم للتعامل مع الجيسون بعد فك سلسلته.

نلاحظ الكونسول، أول برينت النوع سترينق، بعد فك السلسلة باستخدام فنكشن جاهزة بكل لغة اسمها

jsonDecode(jsonStr)

صار نوعه جيسون ماب مثل ما نلاحظ بثاني برينت وهنا بنقدر نتعامل مع البيانات باستخدام هذه الماب داخل كود الموقع او التطبيق مباشرةً، مثلاً بغينا نطبع اول اسم فالوصول له كالتالي

parsedJson[“users”][0][“firstName”] => “Hanaa”

أسلوب مباشر لكن مساوئ هالطريقة كثيرة كلما زاد تعقيد الجيسون منها سوء جودة وقراءة الكود، فالأفضل إننا نفكر بمحتوى الجيسون كمودل كلاس

A model class is typically used to “model” the data in your application. you could write a Model class that mirrors a database table , or a JSON.

بمعنى نفكر بمحتوى الجيسون على انه مودل\كلاس فنرجع للصورة الي فوق ونحاول نحلل محتواه كالتالي

Array of Users have at least 1 instance of User, the user has firstName and lastName as properties

فهمنا من هالتحليل انه ممكن يكون عندنا كلاسين واحد يمثل جميع المستخدمين وواحد يمثل المستخدم الواحد

ملاحظة: في المقال سنركز على كلاس يوزر فقط، الفكرة واحدة لاثنينهم

الان نحتاج ننشئ فنكشن غرضها مثل غرض الكونستركتر الطبيعية لكن الفرق تاخذ عناصر الماب وترجع لنا اوبجكت، بهذا الشكل

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

انتهينا من استقبال جيسون وتحويله من سترينق الى عنصر للغة بشكله المباشر أو المنظم كأوبجكت، الآن لو احتجنا نرسل للسيرفر بيانات جديدة فلابد تكون سترينق لان مثل ماذكرنا نحتاج صيغة موحدة لتسهيل التواصل بين السيرفر والواجهة، فلذلك نحتاج عملية التسلسل

Serialization | التسلسل

ببساطة نعكس العملية السابقة، من ماب او عنصر لغوي الى سترينق يُمكن إرساله، نحتاج إضافة فنكشن في كلاس المستخدم مهمتها تحويل الاوبجكت إلى ماب

نفترض وجود مستخدم جديد سجّل بالموقع\التطبيق اسمها سارة، معلوماتها حاليًا مسجلة كأوبجت لغوي عندنا في الواجهة فنحتاج نحول من اوبجكت إلى ماب اولاً ثم من ماب الى سترينق لإرساله للسيرفر

إعادة تحويله إلى سترينق بيكون بواسطة فنكشن موجودة باللغة

jsonEncode(jsonMap)

We’ve used “Decode/Deserialization” JsonString to convert it to Map/List, in reverse we can “Encode/Serialization” the Map/List into JsonString.

مثال لجيسون معقد وواقعي، سلسلة التعقيدات لن تنتهي في عالم البرمجة لكن رحلة تبسيطها هي من سيصنع المبرمج

! الحمد لله ختامًا وشكرًا للقراءة

--

--

Hanaa Alharbi | الحربي هَن)ء

عُلوم حاسب | مزج الفن مع العِلم فكرة رهيبة بالنسبة لي⚡