השווה שני אובייקטים של JSON עם Gson

1. סקירה כללית

JSON הוא ייצוג מחרוזת של נתונים. ייתכן שנרצה להשוות נתונים אלה באלגוריתמים או בבדיקות שלנו. ולמרות שאפשר להשוות מחרוזות המכילות JSON, השוואת מחרוזות רגישה להבדלים בייצוג, ולא תוכן.

כדי להתגבר על זה ולהשוות נתונים JSON באופן סמנטי, עלינו לטעון את הנתונים למבנה בזיכרון שאינו מושפע מדברים כמו מרחב לבן או מסדר המפתחות של האובייקט.

במדריך קצר זה נפתור זאת באמצעות Gson, ספריית JSON סידור \ deserialization שיכולה לבצע השוואה מעמיקה בין אובייקטים JSON.

2. JSON זהה מבחינה סמנטית במיתרים שונים

בואו נסתכל מקרוב על הבעיה שאנחנו מנסים לפתור.

נניח שיש לנו שני מיתרים המייצגים את אותם נתוני JSON, אך באחד מהם יש רווחים נוספים בסוף:

String string1 = "{\" fullName \ ": \" Emily Jenkins \ ", \" age \ ": 27}"; מחרוזת מחרוזת 2 = "{\" fullName \ ": \" אמילי ג'נקינס \ ", \" גיל \ ": 27}";

למרות שהתוכן של אובייקטים JSON שווה, השוואה בין האמור לעיל כמחרוזות תראה הבדל:

assertNotEquals (string1, string2);

אותו דבר יקרה אם סדר המפתחות באובייקט היה מגוון, למרות ש- JSON בדרך כלל אינו רגיש לכך:

String string1 = "{\" fullName \ ": \" Emily Jenkins \ ", \" age \ ": 27}"; String string2 = "{\" age \ ": 27, \" fullName \ ": \" אמילי ג'נקינס \ "}"; assertNotEquals (string1, string2);

זו הסיבה שנרוויח משימוש בספריית עיבוד JSON להשוואה בין נתוני JSON.

3. תלות של Maven

כדי להשתמש ב- Gson, ראשית נוסיף את התלות של Gson Maven:

 com.google.code.gson gson 2.8.6 

4. ניתוח JSON לאובייקטים של Gson

לפני שנצלול להשוואת אובייקטים, נסתכל כיצד Gson מייצג נתוני JSON בג'אווה.

כשעובדים עם JSON בג'אווה, ראשית עלינו להמיר את מחרוזת JSON לאובייקט ג'אווה. Gson מספק JsonParser המנתח את מקור ה- JSON ל- a JsonElement עֵץ:

מנתח JsonParser = JsonParser חדש (); מחרוזת objectString = "{\" לקוח \ ": {\" fullName \ ": \" אמילי ג'נקינס \ ", \" גיל \ ": 27}}"; String arrayString = "[10, 20, 30]"; JsonElement json1 = parser.parse (objectString); JsonElement json2 = parser.parse (arrayString);

JsonElement הוא מעמד מופשט המייצג אלמנט של JSON. ה לְנַתֵחַ שיטה מחזירה יישום של JsonElement; או א JsonObject, JsonArray, JsonPrimitive אוֹ JsonNull:

assertTrue (json1.isJsonObject ()); assertTrue (json2.isJsonArray ());

כל אחת מאותן מחלקות משנה (JsonObject, JsonArray, וכו.) עוקף את Object.equals שיטה, המספקת השוואה עמוקה יעילה של JSON.

5. מקרי שימוש בהשוואת Gson

5.1. השווה בין שני אובייקטים פשוטים של JSON

נניח שיש לנו שני מיתרים המייצגים אובייקטים פשוטים של JSON, כאשר סדר המקשים שונה:

לאובייקט הראשון יש שם מלא מוקדם יותר מ- גיל:

{"לקוח": {"id": 44521, "fullName": "אמילי ג'נקינס", "גיל": 27}}

השנייה הופכת את הסדר:

{"לקוח": {"id": 44521, "age": 27, "fullName": "אמילי ג'נקינס"}}

אנחנו יכולים פשוט לנתח ולהשוות ביניהם:

assertEquals (parser.parse (string1), parser.parse (string2));

במקרה זה, JsonParser מחזירה א JsonObject, של מי שווים היישום אינורגיש לסדר.

5.2. השווה בין שני מערכי JSON

במקרה של מערכי JSON, JsonParser יחזיר א JsonArray.

אם יש לנו מערך אחד בסדר אחד:

[10, 20, 30]
assertTrue (parser.parse (string1) .isJsonArray ());

אנו יכולים להשוות אותו לאחר בסדר אחר:

[20, 10, 30]

בניגוד JsonObject, JsonArrayשל שווים השיטה רגישה לסדר, כך שהמערכים הללו אינם שווים, וזה נכון מבחינה סמנטית:

assertNotEquals (parser.parse (string1), parser.parse (string2));

5.3. השווה בין שני אובייקטים מקוננים של JSON

כפי שראינו קודם, JsonParser יכול לנתח את המבנה דמוי העץ של JSON. כל אחד JsonObject ו JsonArray מכילים אחרים JsonElement עצמים, שיכולים להיות עצמם מסוגם JsonObject אוֹ JsonArray.

כשאנחנו משתמשים שווים, זה משווה את כל החברים באופן רקורסיבי, כלומר אובייקטים מקוננים דומים גם:

אם זה מחרוזת 1:

{"customer": {"id": "44521", "fullName": "Emily Jenkins", "age": 27, "consum_info": {"fav_product": "Coke", "last_buy": "2012-04 -23 "}}}

וזה JSON הוא מחרוזת 2:

{"customer": {"fullName": "Emily Jenkins", "id": "44521", "age": 27, "consum_info": {"last_buy": "2012-04-23", "fav_product": "קולה"}}}

אז אנחנו עדיין יכולים להשתמש ב- שווים שיטה להשוות ביניהם:

assertEquals (parser.parse (string1), parser.parse (string2));

6. מסקנה

במאמר קצר זה, בחנו את האתגרים של השוואת JSON כ- חוּט. ראינו כיצד Gson מאפשר לנו לנתח את המיתרים הללו למבנה אובייקט התומך בהשוואה.

כמו תמיד, את קוד המקור של הדוגמאות לעיל ניתן למצוא ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found