מפת סדר ועריקה עם ג'קסון

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

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

נדגים כיצד לבצע סדרת סדרים וערוך מחדש מַפָּה, מַפָּה, ו מַפָּה אל וממנה בפורמט JSON מיתרים.

2. תצורת Maven

 com.fasterxml.jackson.core jackson-databind 2.11.1 

תוכל לקבל את הגרסה האחרונה של ג'קסון כאן.

3. סידור

סידור ממיר אובייקט Java לזרם בתים, שניתן לעמוד בו או לשתף אותו לפי הצורך. ג'אווה מפות הם אוספים שממפים מפתח לְהִתְנַגֵד לערך לְהִתְנַגֵד ולעתים קרובות הם האובייקטים הכי פחות אינטואיטיביים לסידור.

3.1. מַפָּה סידור

במקרה הפשוט, בואו ניצור a מַפָּה וסדר אותו ל- JSON:

מפת מפה = HashMap חדש (); map.put ("מפתח", "ערך"); ממפה ObjectMapper = ObjectMapper חדש (); מחרוזת jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (מפה);

ObjectMapper הוא מיפוי הסדרות של ג'קסון, המאפשר לנו לבצע סדרת סדרות שלנו מַפָּה ולכתוב אותו כ- JSON די מודפס חוּט, משתמש ב toString () שיטה ב חוּט:

{ "ערך מפתח" }

3.2. מַפָּה סידור

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

הערה: הגטרים / הקובעים צריכים להיות ציבוריים, ואנו מציינים הערות toString () עם @JsonValue כדי להבטיח שג'קסון משתמש במנהג זה toString () בעת סדרת סדר:

מחלקה ציבורית MyPair {מחרוזת פרטית ראשונה; פרטי מחרוזת שנייה; @Override @JsonValue מחרוזת ציבורית toString () {תחזור ראשון + "ו-" + שנייה; } // גטר סטנדרטי, סטרים, שווים, hashCode, בונים}

עכשיו בואו נגיד לג'קסון איך לסדר סדר MyPair על ידי הרחבת זה של ג'קסון JsonSerializer:

מחלקה ציבורית MyPairSerializer מרחיב את JsonSerializer {ממפה פרטי ObjectMapper = ObjectMapper חדש (); @ Override בטל ציבורי בטל סידור (ערך MyPair, JsonGenerator gen, SerializerProvider serializers) זורק IOException, JsonProcessingException {כותב StringWriter = חדש StringWriter (); mapper.writeValue (כותב, ערך); gen.writeFieldName (writer.toString ()); }}

JsonSerializerכפי שהשם מרמז, סדרתי MyPair ל- JSON באמצעות MyPairשל toString () שיטה. ג'קסון מספק שיעורי Serializer רבים שיתאימו לדרישות הסידור שלך.

אנו פונים MyPairSerializer שלנו מַפָּה עם ה @JsonSerialize ביאור. שים לב שאמרנו רק לג'קסון כיצד לבצע סדרתי MyPair כי זה כבר יודע לעשות סדרתי חוּט:

@JsonSerialize (keyUsing = MyPairSerializer.class) מפת מפה;

בואו נבדוק את סדרת המפות שלנו:

מפה = HashMap חדש (); מפתח MyPair = MyPair חדש ("אבוט", "קוסטלו"); map.put (מפתח, "קומדיה"); מחרוזת jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (מפה);

פלט ה- JSON בסידרה הוא:

{"אבוט וקוסטלו": "קומדיה"}

3.3. מַפָּה סידור

המקרה המורכב ביותר הוא סדרת א מַפָּה, אבל רוב העבודה כבר נעשתה. בואו נשתמש בזה של ג'קסון MapSerializer למפה שלנו, ו MyPairSerializer מהסעיף הקודם לסוגי המפתח והערך של המפה:

@JsonSerialize (keyUsing = MapSerializer.class) מפת מפה; @JsonSerialize (keyUsing = MyPairSerializer.class) MyPair mapKey; @JsonSerialize (keyUsing = MyPairSerializer.class) MyPair mapValue;

בואו נבדוק את סדרת שלנו מַפָּה:

mapKey = MyPair חדש ("אבוט", "קוסטלו"); mapValue = MyPair חדש ("קומדיה", "שנות הארבעים"); map.put (mapKey, mapValue); מחרוזת jsonResult = mapper.writerWithDefaultPrettyPrinter () .writeValueAsString (מפה);

פלט JSON בסידרה באמצעות MyPairשל toString () השיטה, היא:

{"אבוט וקוסטלו": "קומדיה ושנות הארבעים"}

4. התפטרות

Deserialization ממיר זרם של בתים לאובייקט Java שבו אנו יכולים להשתמש בקוד. בחלק זה נתייחס לביטול של קלט JSON לתוכו מַפָּהס של חתימות שונות.

4.1. מַפָּה התפטרות

במקרה הפשוט, בואו ניקח מחרוזת קלט בפורמט JSON ונמיר אותו ל- מַפָּה אוסף Java:

מחרוזת jsonInput = "{\" מפתח \ ": \" ערך \ "}"; TypeReference typeRef = TypeReference חדש() {}; מפת מפה = mapper.readValue (jsonInput, typeRef);

אנו משתמשים בג'קסון ObjectMapper כפי שעשינו לסידור באמצעות readValue () לעבד את הקלט. כמו כן, שימו לב לשימוש שלנו בג'קסון TypeReference, שבה נשתמש בכל דוגמאות העריקול שלנו, כדי לתאר את סוג היעד שלנו מַפָּה. הנה ה toString () ייצוג המפה שלנו:

{key = value}

4.2. מַפָּה התפטרות

עכשיו, בואו נשנה את קלט ה- JSON שלנו ואת ה- TypeReference של היעד שלנו ל מַפָּה:

מחרוזת jsonInput = "{\" אבוט וקוסטלו \ ": \" קומדיה \ "}"; TypeReference typeRef = TypeReference חדש() {}; מפת מפה = mapper.readValue (jsonInput, typeRef);

עלינו ליצור קונסטרוקטור עבור MyPair שלוקח a חוּט עם שני האלמנטים ומנתח אותם ל MyPair אלמנטים:

MyPair ציבורי (מחרוזת שניהם) {מחרוזת [] זוגות = both.split ("ו-"); this.first = זוגות [0] .trim (); this.second = זוגות [1] .trim (); }

וה toString () שלנו מַפָּה האובייקט הוא:

{אבוט וקוסטלו = קומדיה}

קיימת אפשרות נוספת למקרה כאשר אנו מורידים את מחלקת Java המכילה a מַפָּה אנחנו יכולים להשתמש בזה של ג'קסון KeyDeserializer מעמד, אחד משיעורי ההתערערות הרבים שג'קסון מציע. אנו מפרשים את שלנו ClassWithAMap עם @JsonCreator, @JsonProperty, ו @JsonDeserialize:

מחלקה ציבורית ClassWithAMap {@JsonProperty ("מפה") @ JsonDeserialize (keyUsing = MyPairDeserializer.class) מפת מפה פרטית; @JsonCreator ציבורי ClassWithAMap (מפת מפה) {this.map = map; } // זנחים ציבוריים / מגדירים הושמטו}

אנו אומרים לג'קסון לבטל את הערכתו של מַפָּה הכלול ב ClassWithAMapאז אנחנו צריכים להאריך KeyDeserializer לתאר כיצד לבטל את עריכת מפתח המפה, א MyPair אובייקט, מתוך קלט חוּט:

מחלקה ציבורית MyPairDeserializer מרחיבה את KeyDeserializer {@Override public MyPair deserializeKey (מפתח מחרוזת, DeserializationContext ctxt) זורק IOException, JsonProcessingException {להחזיר MyPair חדש (מפתח); }}

אנו בודקים את עריקת הייצור באמצעות readValue:

מחרוזת jsonInput = "{\" אבוט וקוסטלו \ ": \" קומדיה \ "}"; ClassWithAMap classWithMap = mapper.readValue (jsonInput, ClassWithAMap.class);

שוב, ה toString () השיטה שלנו ClassWithAMap המפה נותנת לנו את התפוקה שאנחנו מצפים לה

{אבוט וקוסטלו = קומדיה}

4.3. מַפָּה התפטרות

לבסוף, בואו לשנות את קלט ה- JSON שלנו ואת ה- TypeReference של היעד שלנו ל מַפָּה:

מחרוזת jsonInput = "{\" אבוט וקוסטלו \ ": \" קומדיה ושנות הארבעים \ "}"; TypeReference typeRef = TypeReference חדש() {}; מפת מפה = mapper.readValue (jsonInput, typeRef);

וה toString () שלנו מַפָּה האובייקט הוא:

{אבוט וקוסטלו = קומדיה ושנות הארבעים}

5. מסקנה

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

כמו תמיד, תוכלו לבדוק את הדוגמה המובאת במאמר זה במאגר GitHub.


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