תחילת העבודה עם התנערות בהתאמה אישית בג'קסון

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

מדריך מהיר זה ימחיש כיצד להשתמש בג'קסון 2 כדי לבטל את יישום ה- JSON באמצעות מותאם אישית.

אם אתה רוצה להעמיק וללמוד דברים מגניבים אחרים שאתה יכול לעשות עם ג'קסון 2 - המשך למדריכה הראשית של ג'קסון.

2. התפטרות רגילה

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

מחלקה ציבורית משתמש {מזהה אינטליגנטי; שם מחרוזת ציבורי; } פריט בכיתה ציבורית {id מזהה ציבורי; public String itemName; בעל משתמש ציבורי; }

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

{"id": 1, "itemName": "theItem", "owner": {"id": 2, "name": "theUser"}}

ולסיום, בואו ונפרוש את ה- JSON הזה לגופי Java:

פריט itemWithOwner = ObjectMapper חדש (). ReadValue (json, Item.class);

3. Deserializer מותאם אישית מופעל ObjectMapper

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

{"id": 1, "itemName": "theItem", "createdBy": 2}

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

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: שדה לא מזוהה "createdBy" (מחלקה org.baeldung.jackson.dtos.Item), לא מסומן כבלתי ידוע (3 מאפיינים ידועים: "id", "owner", "itemName" ]) ב- [מקור: [מוגן בדוא"ל]; שורה: 1, עמודה: 43] (דרך שרשרת הפניה: org.baeldung.jackson.dtos.Item ["createdBy"])

נפתור זאת על ידי עשייה עריקת הייצור שלנו עם Deserializer מותאם אישית:

מחלקה ציבורית ItemDeserializer מרחיב StdDeserializer {public ItemDeserializer () {this (null); } ItemDeserializer ציבורי (Class vc) {super (vc); } @Override פריט ציבורי deserialize (JsonParser jp, DeserializationContext ctxt) זורק IOException, JsonProcessingException {JsonNode node = jp.getCodec (). ReadTree (jp); int id = (Integer) ((IntNode) node.get ("id")). numberValue (); מחרוזת itemName = node.get ("itemName"). AsText (); int userId = (Integer) ((IntNode) node.get ("createdBy")). numberValue (); להחזיר פריט חדש (id, itemName, משתמש חדש (userId, null)); }}

כפי שאתה יכול לראות, deserializer עובד עם ייצוג ג 'קסון סטנדרטי של JSON - JsonNode. ברגע שהקלט JSON מיוצג כ- JsonNode, אנחנו יכולים עכשיו להפיק ממנו את המידע הרלוונטי ולבנות משלנו פריט יֵשׁוּת.

במילים פשוטות, אנחנו צריכים רשום deserializer מותאם אישית זה ופשוט לנטוש את ה- JSON בדרך כלל:

ממפה ObjectMapper = ObjectMapper חדש (); מודול SimpleModule = SimpleModule חדש (); module.addDeserializer (Item.class, ItemDeserializer חדש ()); mapper.registerModule (מודול); פריט readValue = mapper.readValue (json, Item.class);

4. Deserializer מותאם אישית בכיתה

לחלופין, אנו יכולים גם רשום את ה- deserializer ישירות בכיתה:

@JsonDeserialize (באמצעות = ItemDeserializer.class) פריט בכיתה ציבורית {...}

עם הגדרת ה- deserializer ברמת הכיתה, אין צורך לרשום אותה ב- ObjectMapper מיפוי ברירת מחדל יעבוד בסדר:

פריט itemWithOwner = ObjectMapper חדש (). ReadValue (json, Item.class);

סוג זה של תצורה לכל מחלקה שימושי מאוד במצבים בהם ייתכן שאין לנו גישה ישירה ל- raw ObjectMapper כדי להגדיר.

5. מסקנה

מאמר זה מראה כיצד למנף את ג'קסון 2 ל קרא קלט JSON לא סטנדרטי - וכיצד למפות את הקלט לכל גרף של יישומי Java עם שליטה מלאה על המיפוי.

יישום כל הדוגמאות וקטעי הקוד ניתן למצוא באתר GitHub - זה פרויקט מבוסס Maven, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.


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