ספר בישול סידור Gson

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

נתחיל בהכרה ישות פשוטה שנשתמש בכל הדוגמאות הבאות:

מחלקה ציבורית SourceClass {int intalue private; מחרוזת מחרוזת פרטית; // סטרים וקובעים סטנדרטיים}

1. סדר מערך ישויות

ראשית, בואו לסדר מערך אובייקטים עם Gson:

@Test ציבור בטל givenArrayOfObjects_whenSerializing_thenCorrect () {SourceClass [] sourceArray = {SourceClass חדש (1, "אחד"), SourceClass חדש (2, "שניים")}; מחרוזת jsonString = Gson חדש (). ToJson (sourceArray); מחרוזת expectResult = "[{" intValue ": 1," stringValue ":" one "}, {" intValue ": 2," stringValue ":" two "}]"; assertEquals (expectResult, jsonString); }

2. סדר סדרות אוסף של ישויות

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

@ מבחן חלל ציבורי givenCollection_whenSerializing_thenCorrect () {אוסף sourceCollection = Lists.newArrayList (חדש SourceClass (1, "אחד"), SourceClass חדש (2, "שניים")); מחרוזת jsonCollection = Gson חדש (). ToJson (sourceCollection); מחרוזת expectResult = "[{" intValue ": 1," stringValue ":" one "}, {" intValue ": 2," stringValue ":" two "}]"; assertEquals (expectResult, jsonCollection); }

3. שנה את שמות השדות של ישות בסידור

לאחר מכן, בואו נראה איך אנחנו יכולים לשנות את שם השדה כשאנחנו מבצעים סדרת ישות.

אנו הולכים לסדר את היישות שלנו הכוללת את השדות intValue ו stringValue לג'סון עם otherIntValue ו otherStringValue:

@ מבחן בטל ציבורי givenUsingCustomSerializer_whenChangingNameOfFieldOnSerializing_thenCorrect () {SourceClass sourceObject = SourceClass חדש (7, "שבע"); GsonBuilder gsonBuildr = GsonBuilder חדש (); gsonBuildr.registerTypeAdapter (SourceClass.class, DifferentNameSerializer חדש ()); מחרוזת jsonString = gsonBuildr.create (). ToJson (sourceObject); מחרוזת expectResult = "{" otherIntValue ": 7," otherStringValue ":" שבע "}"; assertEquals (expectResult, jsonString); }

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

מחלקה ציבורית DifferentNameSerializer מיישמת את JsonSerializer {@Override JsonElement public באופן סדרתי (SourceClass src, Type typeOfSrc, JsonSerializationContext context) {String otherIntValueName = "otherIntValue"; String otherStringValueName = "otherStringValue"; JsonObject jObject = חדש JsonObject (); jObject.addProperty (otherIntValueName, src.getIntValue ()); jObject.addProperty (otherStringValueName, src.getStringValue ()); החזר jObject; }}

4. התעלם משדה בעת סדרת יישות

בואו עכשיו להתעלם משדה לחלוטין בעת ביצוע הסידור:

@Test הציבור בטל givenIgnoringAField_whenSerializingWithCustomSerializer_thenFieldIgnored () {SourceClass sourceObject = SourceClass חדש (7, "שבע"); GsonBuilder gsonBuildr = GsonBuilder חדש (); gsonBuildr.registerTypeAdapter (SourceClass.class, IgnoringFieldsSerializer חדש ()); מחרוזת jsonString = gsonBuildr.create (). ToJson (sourceObject); מחרוזת expectResult = "{" intValue ": 7}"; assertEquals (expectResult, jsonString); }

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

מחלקה ציבורית IgnoringFieldsSerializer מיישמת את JsonSerializer {@Override JsonElement הציבורית מסדרת (SourceClass src, Type typeOfSrc, JsonSerializationContext context) {String intValue = "intValue"; JsonObject jObject = חדש JsonObject (); jObject.addProperty (intValue, src.getIntValue ()); החזר jObject; }}

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

5. סידור שדה רק אם הוא עובר תנאי מותאם אישית

לבסוף, בואו ננתח מקרה שימוש מתקדם יותר - אנו רוצים לסדר שדה רק אם הוא עובר תנאי ספציפי ומותאם אישית.

לדוגמא, בואו לסדר את ערך int רק אם הוא חיובי ופשוט לדלג עליו אם הוא שלילי:

@ מבחן חלל ציבורי givenUsingCustomDeserializer_whenFieldNotMatchesCriteria_thenIgnored () {SourceClass sourceObject = SourceClass חדש (-1, "מינוס 1"); GsonBuilder gsonBuildr = GsonBuilder חדש (); gsonBuildr.registerTypeAdapter (SourceClass.class, IgnoringFieldsNotMatchingCriteriaSerializer חדש ()); Gson gson = gsonBuildr.create (); הקלד sourceObjectType = TypeToken חדש () {} .getType (); מחרוזת jsonString = gson.toJson (sourceObject, sourceObjectType); מחרוזת expectResult = "{" stringValue ":" מינוס 1 "}"; assertEquals (expectResult, jsonString); }

כמובן שאנחנו משתמשים סידור מותאם אישית גם כאן:

מחלקה ציבורית IgnoringFieldsNotMatchingCriteriaSerializer מיישמת את JsonSerializer {@Override JsonElement הציבור סדרתי (SourceClass src, סוג typeOfSrc, JsonSerializationContext הקשר) {JsonObject jObject = JsonObject חדש (); // קריטריונים: intValue> = 0 if (src.getIntValue ()> = 0) {String intValue = "intValue"; jObject.addProperty (intValue, src.getIntValue ()); } מחרוזת stringValue = "stringValue"; jObject.addProperty (stringValue, src.getStringValue ()); החזר jObject; }}

וזהו - 5 מקרים שימושיים נפוצים של סידור באמצעות Gson.


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