دليل هام لاختبار بقية API وإعادة التأكيد

في هذا البرنامج التعليمي الشامل "كن مطمئنًا" سوف نتعلم بقية اختبار API في العمق ، أتمتة اختبار API جنبًا إلى جنب مع Rest Assured في نهج نمطي

ما هو RestAssured واستخدامه

Rest Assured هي تقنية مفتوحة المصدر مستخدمة على نطاق واسع لاختبار أتمتة REST API ، وهذا يعتمد على مكتبة تعتمد على جافا.

يتفاعل Rest Assured مع Rest API في وضع عميل بدون رأس ، يمكننا تحسين نفس الطلب عن طريق إضافة طبقات مختلفة لتشكيل الطلب وإنشاء طلب HTTP عبر أفعال HTTPS مختلفة إلى الخادم.

توفر مكتبة Rest Assured المضمنة أساليب وأدوات مساعدة هائلة لإجراء التحقق من صحة الاستجابة الواردة من الخادم مثل رسالة الحالة ورمز الحالة وجسم الاستجابة.

تتكون هذه السلسلة الكاملة من دروس Rest Assured لاختبار أتمتة REST API من الموضوعات التالية:

RestAssured - اختبار API التعليمي المطمئن
كن مطمئنًا أتمتة واجهة برمجة التطبيقات

الشروع في العمل: تكوين restAssured مع أداة البناء مثل Maven / gradle

الخطوة 1: إذا كنت تعمل مع maven فقط أضف التبعية التالية في pom.xml (يمكنك اختيار أي إصدار آخر أيضًا):

لبدء استخدام REST Assured ، ما عليك سوى إضافة التبعية إلى مشروعك. 


    مطمئن
    اطمئن، لا تشغل بالك
    4.3.0
    اختبار

إذا كنت تعمل مع gradle ، فما عليك سوى إضافة ما يلي في build.gradle (مرة أخرى ، يمكنك اختيار أي إصدار آخر أيضًا):

testCompile group: 'io.rest-assured' ، الاسم: 'rest-assured' ، الإصدار: '4.3.0'

الخطوة 2: يمكن دمج REST Assured واستخدامه بسهولة شديدة مع أطر عمل اختبار الوحدة الحالية ، مثل Testng و JUnit

نحن هنا نستخدم testNg وفقًا لإطار اختبار الوحدة.

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

استيراد io.restassured.RestAssured ثابت. * ؛

استيراد ثابت org.hamcrest.Matchers. * ؛

NOTE: لغرض التعلم القادم هذا ، سنختبر Ergast Developer API ، والتي يمكن العثور عليها هنا. توفر واجهة برمجة التطبيقات هذه البيانات التاريخية المتعلقة بسباقات الفورمولا 1 والسائقين والدوائر وما إلى ذلك.

الإلمام بالنحو:

Rest Assured يدعم تنسيق BDD (تركيب غيركين) لكتابة نصوص الاختبار ، على سبيل المثال ، في الشكل المعطى / متى / بعد ذلك / والتنسيق ، نحن نفترض أنك تفهم بناء جملة BDD / gherkin ، إذا لم يكن الأمر كذلك ، فإننا نقترح قضاء 30 دقيقة من الوقت لفهم ما هو BDD (تركيب غيركين) وكيف يعمل وهو أساسي للغاية.

T-01: نصنا الأول الذي يقوم بشكل أساسي بالتحقق من صحة عدد الدوائر في F1 في عام 1 باستخدام واجهة برمجة التطبيقات هذه (http://ergast.com/api/f1/2017/circuits.json)

Test (description = "عدد الدوائر في موسم 2017 يجب أن يكون 20") باطل عام التحقق من صحة NumberOfCircuits () {مُعطى (). when (). get ("http://ergast.com/api/f1/2017/circuits. json "). ثم (). assertThat (). body ("MRData.CircuitTable.Circuits.circuitId"، hasSize (20)) ؛ }

بقية التحقق من استجابة API :

1. يلتقط استجابة JSON لطلب واجهة برمجة التطبيقات.

2. استعلامات لمعرف الدائرة باستخدام تعبير GPath "MRData.CircuitTable.Circuits.circuitId"

3. يتحقق من حجم مجموعة عناصر معرف الدائرة 20

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

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

يمكنك أيضًا الرجوع إلى وثائق مكتبة Hamcrest للحصول على قائمة كاملة بالمطابقات والأساليب.

التحقق من رمز الاستجابة:

معطى (). عندما (). get ("http://ergast.com/api/f1/2017/circuits.json"). ثم (). assertThat (). statusCode (200) ؛

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

معطى (). عندما (). get ("http://ergast.com/api/f1/2017/circuits.json"). ثم (). assertThat (). contentType (ContentType.JSON) ؛

التحقق من صحة العنوان "طول المحتوى"

معطى (). عندما (). get ("http://ergast.com/api/f1/2017/circuits.json") .then (). assertThat (). header (" Content-Length "، equTo (" 4551 ")) ؛

التحقق من الصحة المتعددة في اختبارات واحدة مثل (باستخدام و () طريقتين):

Test (الوصف = "عدد الدوائر في موسم 2017 يجب أن يكون 20")
    التحقق من صحة الفراغ العام
        معطى (). عندما (). الحصول على ("http://ergast.com/api/f1/2017/circuits.json"). ثم (). assertThat (). header ("Content-Length"، equTo (" 4551 ")). و (). statusCode (200) ؛
    }

التحقق من صحة عنصر / سمة نص الاستجابة:

يمكننا استخدام JsonPath لجلب قيمة سمات json ووضع التوكيد باستخدام TestNg

Test (الوصف = "التحقق من صحة اسم السلسلة وهو f1")
    التحقق من الصحة العامة الباطلةSeriesName () {
        // تحويل ResponseBody إلى سلسلة
        String responseBody = معطى (). عندما (). get ("http://ergast.com/api/f1/2017/circuits.json") .getBody (). asString ()؛
        // إنشاء كائن JsonPath عن طريق تمرير نص الاستجابة كسلسلة
        JsonPath resJson = جديد JsonPath (responseBody) ؛
        // إحضار سلسلة قيمة السمة ضمن MRData
        String seriesName = resJson.getString ("MRData.series") ؛
        // تأكيد TestNg المستخدم
        Assert.assertEquals ("f1" ، اسم السلسلة) ؛
    }

بنفس الطريقة يمكننا الحصول على قيمة استجابة XML باستخدام XMLPath. هنا نعمل مع JSON ومن ثم استخدمنا هنا JSonPath

تدعم واجهات برمجة تطبيقات RESTful نوعين فقط من المعلمات:

A. معلمات الاستعلام: يتم إلحاق المعلمات هنا في نهاية نقطة نهاية واجهة برمجة التطبيقات ويمكن تحديدها بواسطة علامة الاستفهام وتشكل زوج قيمة مفتاح مثل 

https://www.google.com/search?q=https://www.wikipedia.org/

هنا في API أعلاه 'q' هي المعلمة و 'https://www.wikipedia.org/' هي قيمة تلك المعلمة ، إذا أردنا البحث 'SOMETHING_ELSE_TEXTيمكننا استبدال قيمة المعلمة مع 'SOMETHING_ELSE_TEXT"مكان https://www.wikipedia.org/.

B. معلمات المسار: هذه هي جزء من نقطة نهاية RESTful API. 

على سبيل المثال نقطة النهاية التي استخدمناها سابقًا: http://ergast.com/api/f1/2017/circuits.json ، هنا "2017" هي قيمة معلمة المسار.

للحصول على نتيجة العام 2016 يمكننا استبدال عام 2017 بـ 2016 ثم ستقدم واجهة برمجة التطبيقات نص الاستجابة لعام 2016.

الاختبارات باستخدام Path Params for RestAssured

Test (الوصف = "التحقق من عدد الدوائر باستخدام Path Params")
    public void testWithPathParams () {
        String seasonNumber = "2017" ؛
       استجابة السلسلة () ؛
        // إنشاء كائن JsonPath عن طريق تمرير نص الاستجابة كسلسلة
        JsonPath resJson = جديد JsonPath (responseBody) ؛
        // إحضار سلسلة قيمة السمة ضمن MRData
        String seriesName = resJson.getString ("MRData.series") ؛
        // تأكيد TestNg المستخدم
        Assert.assertEquals ("f1" ، اسم السلسلة) ؛
    }

الاختبارات باستخدام Query Params for RestAssured

Test (description = "التحقق من صحة بحث Google باستخدام Query Params")
    public void testWithPathParams () {
        سلسلة searchItem = "https://www.wikipedia.org/";
  معطى (). queryParam ("q"، searchItem). when (). get ("https://www.google.com/search"). ثم (). assertThat (). statusCode (200) ؛
    }

اختبارات المعامِلات:

يمكننا إجراء اختبار يعتمد على البيانات (على سبيل المثال ، سيتم تنفيذ نفس البرنامج النصي للاختبار عدة مرات مع مجموعات مختلفة من بيانات الإدخال وتوفير بيانات إخراج مختلفة) باستخدام Rest Assured 

الخطوة 1: إنشاء موفر بيانات testNg.

الخطوة 2: استهلك موفر البيانات في اختبار البرنامج النصي.

DataProvider (الاسم = "seasonsAndRaceNumbers")
    كائن عام [] [] testDataFeed () {
        إرجاع كائن جديد [] [] {
                {"2017" ، 20} ،
                {"2016" ، 21}
        };
    }
Test (description = "عدد الدوائر المصادقة في المواسم المختلفة" ، dataProvider = "المواسم وأرقام السباق") دائرة باطلة عمومية ().pathParam ("الموسم" ، الموسم العام). عندما (). احصل على ("http://ergast.com/api/f1/{الموسم}/circuits.json "). ثم (). assertThat (). body (" MRData.CircuitTable.Circuits.circuitId "، hasSize (أرقام السباق)) ؛ }

العمل مع المعلمات متعددة القيم مع RestAssured 

المعلمات متعددة القيم هي تلك المعلمات التي تحتوي على أكثر من قيمة واحدة لكل اسم معلمة (أي قائمة القيم لكل معلمة) ، يمكننا معالجتها على النحو التالي:

معطى (). param ("paramKey"، "paramValue1"، "paramaValue2"). when (). get (“API URL”)؛

أو يمكننا إعداد قائمة وتمرير القائمة كقيمة لـ paramKey مثل:

قائمة paramValue = ArrayList جديد جديد () ؛
paramValue.add (“paramvalue1”)؛
paramValue.add (“paramvalue2)؛
معطى (). param ("paramKey"، paramValue) .when (). get (“عنوان URL الخاص بواجهة برمجة التطبيقات“) ؛
العمل مع ملف تعريف الارتباط مع RestAssured 
معطى (). cookie ("cookieK"، "cookieVal"). when (). get ("API URL")؛

Or 

يمكننا أيضًا تحديد ملف تعريف ارتباط متعدد القيم هنا مثل:

معطى (). cookie ("cookieK"، "cookieVal1"، "cookieVal2"). when (). get (“API URL”)؛

العمل مع الرؤوس:

يمكننا التحديد في طلب باستخدام رأس / رؤوس مثل:

معطى (). header ("headerK1"، "headerValue1"). header ("headerK2"، "headerValue2"). when (). get ("API URL") ؛

العمل مع نوع المحتوى:

معطى (). contentType ("application / json"). when (). get (“API URL”) ؛

Or 

معطى (). contentType (ContentType.JSON) .when (). get () ؛

قياس وقت الاستجابة:

long timeDurationInSeconds = get (“عنوان URL لواجهة برمجة التطبيقات”). timeIn (SECONDS) ؛

بقية مصادقة API

يدعم REST أنظمة المصادقة المختلفة ، مثل OAuth والملخص والشهادة والنموذج والمصادقة الأساسية الوقائية. يمكننا إما تعيين المصادقة لكل طلب 

هنا نموذج طلب باستخدام نفس:

معطى (). auth (). basic ("uName"، "pwd"). when (). get (“URL”) ..

من ناحية أخرى ، المصادقة والمحددة في النهج أدناه لطلبات HTTP:

RestAssured.authentication = basic ("uName"، "pwd")؛

أنواع المراجع الأساسية:

هناك نوعان من المصادقة الأساسية ، "الاستباقية" و "المصادقة الأساسية للرمز المعترض عليه".

المصادقة الأساسية الوقائية:

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

على سبيل المثال.

معطى (). auth (). وقائي (). basic ("uName"، "pwd"). when (). get ("URL"). then (). statusCode (200)؛

تحدي المصادقة الأساسية

من ناحية أخرى ، لن تقوم "المصادقة الأساسية المعترض عليها" REST Assured بتزويد بيانات الاعتماد ما لم يطلب الخادم ذلك صراحة ، أي أن الخادم يطرح استجابة غير مصرح بها. بعد ذلك الرد غير المصرح به ، يرسل Rest-Assured طلبًا آخر إلى الخادم وهو المصادقة.

معطى (). auth (). basic ("uName"، "pwd"). when (). get ("URL"). then (). statusCode (200)؛

ملخص صحة البيانات

اعتبارًا من الآن ، يتم النظر فقط في "مصادقة الملخص المطعون فيه". على سبيل المثال:

معطى (). auth (). abstract ("uName"، "pwd"). when (). get ("URL"). then (). statusCode (200)؛ 

مصادقة النموذج

يمكننا تحقيق ذلك بشكل رئيسي في 3 طرق مختلفة اعتمادًا على التطبيق / السيناريوهات:

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

منح (). auth (). form ("uName"، "pWd").
عندما (). get ("URL") ؛
ثم (). statusCode (200) ؛

في حين أن هذا قد لا يعمل على النحو الأمثل ، إلا أنه قد يمر أو يفشل اعتمادًا على مدى تعقيد صفحة الويب. الخيار الأفضل هو توفير هذه التفاصيل عند إعداد مصادقة النموذج في النهج أدناه:

معطى (). auth (). form ("uName"، "pwd"، FormAuthConfig جديد ("/ 'أذكر هنا اسم الإجراء الذي يمثل جزءًا من كود صفحة html وتحت علامة النموذج'" ، "uName" ، "pwd ")). عندما (). get (" URL "). ثم (). statusCode (200) ؛

في هذا النهج ، لن يتطلب REST Assured داخليًا تشغيل طلب إضافي وتحليل من خلال صفحة الويب. 

إذا كنت في حالة استخدام Spring Security الافتراضي ، فحينئذٍ يتم تشغيل FormAuthConfig المعرفة مسبقًا.

معطى (). auth (). form ("uName"، "Pwd"، FormAuthConfig.springSecurity ()). when (). get ("URL"). then (). statusCode (200)؛

ملاحظة: إذا أردنا إرسال بيانات إدخال إضافية مع مصادقة النموذج ، فيمكننا كتابة ما يلي:

معطى (). auth (). form ("uName"، "pwd"، formAuthConfig (). withAdditionalFields ("firstInputField"، "secondInputField"). ..

CSRF:

CSRF لتقف على طلب التزوير عبر المواقع.

في الوقت الحاضر ، من الشائع جدًا أن يقوم الخادم بتوفير رمز CSRF مع الاستجابة لتجنب هجمات أمان CSRF. يدعم REST Assured هذا عن طريق استخدام المحلل اللغوي التلقائي وتوفير رمز CSRF المميز. 

من أجل تحقيق REST Assured هذا ، تحتاج إلى تقديم طلب إضافي وتحليل (موضع قليل) من الموقع.

يمكننا تمكين دعم CSRF عن طريق كتابة الكود أدناه:

معطى (). auth (). form ("uName"، "pwd"، formAuthConfig (). withAutoDetectionOfCsrf ()). when (). get ("URL"). then (). statusCode (200) ؛

بالإضافة إلى مساعدة REST Assured وجعل التحليل أكثر قوة وقوة ، يمكننا توفير اسم حقل CSRF (هنا نفترض أننا نستخدم القيم الافتراضية لـ Spring Security ويمكننا استخدام springSecurity FormAuthConfig المحدد مسبقًا):

معطى (). auth (). form ("uName"، "pwd"، springSecurity (). withCsrfFieldName ("_ csrf")). when (). get ("URL"). then (). statusCode (200) ؛

بشكل افتراضي ، يتم تمرير قيمة CSRF كمعامل نموذج مع الطلب ولكن يمكننا تهيئته لإرساله كرأس إذا كان مطلوبًا في حالة ما يلي:

معطى (). auth (). form ("uName"، "pwd"، springSecurity (). withCsrfFieldName ("_ csrf"). sendCsrfTokenAsHeader ()). when (). get ("URL"). ثم (). statusCode (200) ؛

OAuth 1:

يتطلب OAuth 1 أن يكون Scribe في مسار الفصل الدراسي. لاستخدام مصادقة oAuth 1 ، يمكننا القيام بما يلي:

معطى (). auth (). oauth (..). when (). ..

OAuth 2:

معطى (). auth (). oauth2 (accessToken). when (). ..

في النهج أعلاه ، سيتم اعتبار OAuth2 accessToken في رأس. لكي نكون أكثر وضوحًا ، يمكننا أيضًا القيام بما يلي:

معطى (). auth (). وقائي (). oauth2 (accessToken). عندما (). ..

تمرير ملف أو مصفوفة بايت أو دفق إدخال أو نص في الطلب:

عند إرسال كميات كبيرة من البيانات إلى الخادم ، فمن الشائع استخدام أسلوب بيانات النموذج متعدد الأجزاء. تقدم Rest Assured طرقًا تسمى multiPart والتي تتيح لنا تحديد ملف أو مصفوفة بايت أو دفق إدخال أو نص للتحميل. 

معطى (). multiPart (ملف جديد ("/ File_Path")). when (). post ("/ upload") ؛

إنشاء طلب POST مع كونه مطمئنًا

مع طلبات POST و PUT ، نرسل البيانات إلى الخادم وإنشاءها الأساسي للموارد / تحديث الموارد ، يمكنك اعتبار ذلك بمثابة عملية كتابة أو تحديث.

يتم إرسال البيانات التي يتم إرسالها إلى الخادم في طلب POST في نص طلب HTTP / استدعاء API. 

يمكن أن يكون نوع المحتوى أو البيانات التي يتم إرسالها من تنسيق مختلف اعتمادًا على API ، مثل XML أو JSON أو أي تنسيق آخر يتم تحديده بواسطة رأس نوع المحتوى. 

إذا كان نص POST يتكون من بيانات JSON ، فسيكون نوع محتوى الرأس هو application / json. وبالمثل ، بالنسبة لطلب POST الذي يتكون من XML ، فسيكون رأس نوع المحتوى من نوع application / xml.

إليك مقتطف الشفرة أدناه لنفسه:

معطى (). contentType ("application / json"). param ("pk"، "pv"). when (). body ("JsonPAyloadString"). post ("url"). ثم (). assertThat (). statusCode (200) ؛

ملاحظة: هناك طرق مختلفة لتمرير نص الحمولة / الطلب داخل الطريقة "body" مثل String (كما هو موضح في المقتطف أعلاه) ، JsonObject ، كملف وما إلى ذلك ،

طلب PUT مع إطمئنانك:

معطى (). contentType ("application / json"). param ("pk"، "pv"). when (). body ("JsonPAyloadString"). put ("url"). ثم (). assertThat (). statusCode (200) ؛

حذف الطلب مع Rest-Assured:

معطى (). contentType ("application / json"). param ("pk"، "pv"). when (). delete ("url"). then (). assertThat (). statusCode (200)؛

وبهذه الطريقة يمكننا إنشاء استدعاء مختلف لـ Rest API لأفعال API مختلفة (GET / POST / PUT / DELETE ، إلخ)

التسلسل وإلغاء التسلسل في Java:

التسلسل هو في الأساس معالجة أو تحويل حالة الكائن إلى دفق بايت. من ناحية أخرى ، يقوم إلغاء التسلسل في Java بمعالجة أو تحويل دفق البايت إلى كائن Java فعلي داخل الذاكرة. يتم استخدام هذه الآلية في استمرار الكائن.

يوجد أدناه مخطط الكتلة لنفسه 

مزايا التسلسل

أ لحفظ / استمرار حالة الكائن.

ب. لتدفق كائن عبر الشبكة.

تحقيق التسلسل مع JAVA

لتحقيق كائن Java قابل للتسلسل ، نحتاج إلى تنفيذ واجهة java.io.Serializable.

فئة ObjectOutputStream التي تحتوي على طريقة writeObject () المسؤولة عن إجراء تسلسل لكائن.

تحتوي فئة ObjectInputStream أيضًا على طريقة أخرى تسمى readObject () وهي مسؤولة عن إلغاء تسلسل الكائن.

الفئات التي تقوم بتنفيذ واجهة java.io.Serializable ، لا يمكن إجراء تسلسل إلا للكائن.

Serializable هو مجرد واجهة علامة ومثل واجهة السوق الأخرى ، لا يحتوي على عضو بيانات أو طريقة مرتبطة به ، والتي تُستخدم لـ "تمييز" فئات جافا بحيث تحصل كائنات هذه الفئات على إمكانات معينة. مثل بعض واجهات العلامات الأخرى: - قابلة للاستنساخ والبعيدة وما إلى ذلك.

ملحوظات :

1. إذا نفذت فئة رئيسية واجهة Serializable ، فلن تكون الفئة الفرعية مطلوبة لتنفيذ نفس الواجهة ولكن العكس بالعكس غير قابل للتطبيق.

2. يتم تخزين أعضاء البيانات غير الثابتة فقط مع عملية التحويل التسلسلي.

3. لا يتم تخزين أعضاء البيانات الثابتة وكذلك أعضاء البيانات العابرة عن طريق التسلسل. لذلك ، في حالة إذا لم نكن بحاجة إلى تخزين قيمة عضو البيانات غير الثابتة ، فيمكننا جعلها عابرة.

4. لا يتم استدعاء المُنشئ مطلقًا عند إلغاء تسلسل عنصر ما.

الخطوة 1: تتمثل الخطوة الأولى أساسًا في إنشاء فئة تنفذ واجهة Serializable:

استيراد java.io.Serializable ؛
دمية فئة عامة تنفذ Serializable {
    الخاص أنا ؛
    بيانات السلسلة الخاصة ؛
    دمية عامة (int i ، بيانات السلسلة)
    {
        هذا أنا = أنا ؛
        this.data = بيانات ؛
    }
}

الخطوة 2: قم بإنشاء فئة لإجراء تسلسل لها:

استيراد java.io.FileNotFoundException ؛
استيراد java.io.FileOutputStream ؛
استيراد java.io.IOException ؛
استيراد java.io.ObjectOutputStream ؛
فئة عامة Serialize {
    تسلسل باطل ثابت عام (Object classObject ، String fileName) {
        محاولة {
            FileOutputStream fileStream = جديد FileOutputStream (اسم الملف) ؛
            ObjectOutputStream objectStream = new ObjectOutputStream (fileStream) ؛
            objectStream.writeObject (classObject) ،
            objectStream.close () ،
            fileStream.close () ،
        } catch (FileNotFoundException e) {
            // كتلة الصيد التي تم إنشاؤها تلقائيًا TODO
            e.printStackTrace () ؛
        } catch (IOException e) {
            // كتلة الصيد التي تم إنشاؤها تلقائيًا TODO
            e.printStackTrace () ؛
        }
    }
    ثابت الفراغ الثابت الرئيسي (سلسلة [] الحجج) {
        Dummy dummyObj = دمية جديدة (10، "Lambda-geeks") ؛
        التسلسل (dummyObj ، "DummSerialized") ؛
    }
}

الخطوة 3: بمجرد اكتمال الخطوة 2 بنجاح ، سترى ملفًا تم إنشاؤه مع بعض البيانات فيه ، وهذه البيانات هي في الأساس بيانات متسلسلة لأعضاء الكائن.

  إلغاء التسلسل بجافا:

فيما يلي مقتطف الشفرة أدناه:

 DeSerialize الكائن الثابت العام (String fileName)
    {
        محاولة {
            FileInputStream fileStream = جديد FileInputStream (ملف جديد (اسم الملف)) ؛
            ObjectInputStream objectStream = new ObjectInputStream (fileStream) ؛
            كائن deserializeObject = objectStream.readObject () ،
            objectStream.close () ،
            fileStream.close () ،
            عودة إلغاء تسلسل الكائن ؛
        } catch (FileNotFoundException e) {
            e.printStackTrace () ؛
        } catch (IOException e) {
            e.printStackTrace () ؛
        } catch (ClassNotFoundException e) {
            e.printStackTrace () ؛
        }
        عودة فارغة ؛
    }

كود السائق يذهب على النحو التالي:

 ثابت الفراغ الثابت الرئيسي (سلسلة [] الحجج) {
      / * Dummy dummyObj = دمية جديدة (10، "Lambda-geeks") ؛
        التسلسل (dummyObj ، "DummSerialized") ؛
        System.out.println ("------------------------------------------- ------------------------------- ") ؛
      */
        Dummy deSerializedRect = (وهمي) DeSerialize ("DummSerialized") ؛
        System.out.println ("بيانات من كائن تسلسلي" + deSerializedRect.print ()) ؛
        System.out.println ("------------------------------------------- ------------------------------- ") ؛
    }

JSONPATH المزيد من بناء الجملة / الاستعلام:

لنفترض JSON على النحو التالي:

{
  "OrganizationDetails": "Dummy Details of the Organization" ،
  "المنطقة": "آسيا" ،
  "تفاصيل التمكين": [
    {
      "Org": "lambda-Geeks"،
      "معلومة": {
        "فتاه": 1234567890 ،
        "إضافة": "XYZ" ،
        "العمر": 45
      }
    },
    {
      "Org": "lambda-Geeks-2"،
      "معلومة": {
        "فتاه": 2134561230 ،
        "إضافة": "ABC" ،
        "العمر": 35
      }
    }
  ]
}

في JSON أعلاه ، يُطلق على OrganizationDetails & Region كسبب لعقد Leaf نظرًا لعدم وجود أي عُقد / عناصر فرعية أخرى ، ولكن من ناحية أخرى ، فإن Emp-Details لها عقدة فرعية ، ومن ثم لم تتم الإشارة إليها كعقدة Leaf.

هنا إذا حاولنا الحصول على قيمة OrganizationDetails ، فسنحتاج إلى استخدام:

تفاصيل المنظمة $ 
سينتج عن ذلك:
 [
  "تفاصيل وهمية عن المنظمة"
]

مثل Wise للحصول على بيانات المنطقة نحتاج إلى كتابتها:

$. المنطقة 

إذا أردنا العثور على قيمة العمر للموظف الأول ، فيمكننا كتابة:

$ .Emp-Details [0] .Information.Age
سينتج عن ذلك:
[
  45
]

بالنسبة لعمر الموظف الثاني ، يمكننا كتابة مثل

$ .Emp-Details [1] .Information.Age
سينتج عن ذلك: [35]

بهذه الطريقة يمكننا معرفة تعبير / استعلام JsonPath لجلب البيانات للحقول المعنية في JSON.

انتقل إلى الأعلى