מבוא ל- ObjectMapper של ג'קסון

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

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

כדי להבין יותר אודות ספריית ג'קסון באופן כללי, מדריך ג'קסון הוא מקום טוב להתחיל בו.

2. תלות

ראשית נוסיף את התלות הבאות ל- pom.xml:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

תלות זו תוסיף באופן סדיר את הספריות הבאות למסלול הכיתה:

  1. הערות ג'קסון
  2. ג'קסון-ליבה

השתמש תמיד בגירסאות האחרונות מהמאגר המרכזי של Maven עבור jackson-databind.

3. קריאה וכתיבה באמצעות ObjectMapper

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

הפשוט readValue ממשק API של ObjectMapper היא נקודת כניסה טובה. אנו יכולים להשתמש בו לניתוח או ערעור מחדש של תוכן JSON לאובייקט Java.

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

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

רכב בכיתה ציבורית {צבע מחרוזת פרטי; סוג מחרוזת פרטי; // מגדלי גטרים סטנדרטיים}

3.1. אובייקט Java ל- JSON

בואו נראה דוגמה ראשונה לסידור אובייקט Java ל- JSON באמצעות ה- writeValue שיטת ה- ObjectMapper מעמד:

ObjectMapper objectMapper = ObjectMapper חדש (); מכונית לרכב = רכב חדש ("צהוב", "רנו"); objectMapper.writeValue (קובץ חדש ("target / car.json"), מכונית); 

הפלט של האמור לעיל בקובץ יהיה:

{"color": "צהוב", "type": "renault"} 

השיטות writeValueAsString ו writeValueAsBytes שֶׁל ObjectMapper מחלקה ליצור JSON מאובייקט Java ולהחזיר את JSON שנוצר כמחרוזת או כמערך בתים:

String carAsString = objectMapper.writeValueAsString (car); 

3.2. JSON ל- Java Object

להלן דוגמה פשוטה להמרת מחרוזת JSON לאובייקט Java באמצעות ה- ObjectMapper מעמד:

מחרוזת json = "{\" color \ ": \" שחור \ ", \" סוג \ ": \" BMW \ "}"; מכונית רכב = objectMapper.readValue (json, Car.class); 

ה readValue () הפונקציה מקבלת גם צורות קלט אחרות, כגון קובץ המכיל מחרוזת JSON:

מכונית רכב = objectMapper.readValue (קובץ חדש ("src / test / resources / json_car.json"), Car.class);

או כתובת URL:

מכונית לרכב = objectMapper.readValue (URL חדש ("file: src / test / resources / json_car.json"), Car.class);

3.3. ג'סון לג'קסון JsonNode

לחלופין, ניתן לנתח JSON ל- JsonNode אובייקט ומשמש לאחזור נתונים מצומת ספציפי:

מחרוזת json = "{\" color \ ": \" שחור \ ", \" סוג \ ": \" FIAT \ "}"; JsonNode jsonNode = objectMapper.readTree (json); צבע מחרוזת = jsonNode.get ("צבע"). AsText (); // פלט: צבע -> שחור 

3.4. יצירת רשימת Java ממחרוזת JSON Array

אנו יכולים לנתח JSON בצורה של מערך לרשימת אובייקטים של Java באמצעות a TypeReference:

מחרוזת jsonCarArray = "[{\" צבע \ ": \" שחור \ ", \" סוג \ ": \" BMW \ "}, {\" צבע \ ": \" אדום \ ", \" סוג \ ": \ "FIAT \"}] "; List listCar = objectMapper.readValue (jsonCarArray, TypeReference חדש(){}); 

3.5. יצירת מפת ג'אווה ממחרוזת JSON

באופן דומה, אנו יכולים לנתח JSON לתוך Java מַפָּה:

מחרוזת json = "{\" color \ ": \" שחור \ ", \" סוג \ ": \" BMW \ "}"; מפת מפה = objectMapper.readValue (json, TypeReference חדש(){}); 

4. תכונות מתקדמות

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

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

4.1. קביעת תצורה של תכונת סידור או דה-סידור

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

מחרוזת jsonString = "{\" צבע \ ": \" שחור \ ", \" סוג \ ": \" פיאט \ ", \" שנה \ ": \" 1970 \ "}"; 

מחרוזת JSON בדוגמה שלעיל בתהליך הניתוח המוגדר כברירת מחדל לאובייקט Java עבור ה- מכונית כיתה יביא ל UnrecognizedPropertyException יוצא מן הכלל.

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

objectMapper.configure (DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); מכונית רכב = objectMapper.readValue (jsonString, Car.class); JsonNode jsonNodeRoot = objectMapper.readTree (jsonString); JsonNode jsonNodeYear = jsonNodeRoot.get ("שנה"); שנת מחרוזת = jsonNodeYear.asText (); 

אפשרות נוספת מבוססת על FAIL_ON_NULL_FOR_PRIMITIVES, המגדיר אם ה- ריק ערכים לערכים פרימיטיביים מותרים:

objectMapper.configure (DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false); 

בדומה לכך, FAIL_ON_NUMBERS_FOR_ENUM שולט אם מותר לסדר / לערוך ערכי enum כמספרים:

objectMapper.configure (DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS, false);

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

4.2. יצירת Serializer מותאם אישית או Deserializer

תכונה חיונית נוספת של ObjectMapper מחלקה היא היכולת לרשום סידורי לייזר וסילוק אוטומטי.

סידורי סדרת וניתוח מחלפים מותאמים אישית מאוד שימושיים במצבים בהם תגובת ה- JSON של קלט או פלט שונה במבנהם ממחלקת ה- Java אליה יש לסדר או לבצע סיווג מחדש.

להלן דוגמה לסידור JSON מותאם אישית:

מחלקה ציבורית CustomCarSerializer מרחיב StdSerializer {ציבורי CustomCarSerializer () {זה (null); } CustomCarSerializer ציבורי (Class t) {super (t); } @Override חלל ציבורי בסידור (מכונית רכב, JsonGenerator jsonGenerator, SerializerProvider serializer) {jsonGenerator.writeStartObject (); jsonGenerator.writeStringField ("car_brand", car.getType ()); jsonGenerator.writeEndObject (); }} 

ניתן להפעיל את הסידור המותאם אישית הזה כך:

ממפה ObjectMapper = ObjectMapper חדש (); מודול SimpleModule = SimpleModule חדש ("CustomCarSerializer", גרסה חדשה (1, 0, 0, null, null, null)); module.addSerializer (Car.class, CustomCarSerializer חדש ()); mapper.registerModule (מודול); מכונית לרכב = רכב חדש ("צהוב", "רנו"); מחרוזת carJson = mapper.writeValueAsString (רכב); 

הנה מה ש אוטו נראה (כמו פלט JSON) בצד הלקוח:

var carJson = {"car_brand": "renault"} 

והנה דוגמה ל מכשיר deserializer מותאם אישית של JSON:

מחלקה ציבורית CustomCarDeserializer מרחיב את StdDeserializer {public CustomCarDeserializer () {this (null); } CustomCarDeserializer ציבורי (Class vc) {super (vc); } @Override ציבורי ביטול ערעור (JsonParser מנתח, DeserializationContext deserializer) {מכונית רכב = רכב חדש (); קודק ObjectCodec = parser.getCodec (); צומת JsonNode = codec.readTree (מנתח); // נסה לתפוס את חסימת JsonNode colorNode = node.get ("צבע"); צבע מחרוזת = colorNode.asText (); car.setColor (צבע); רכב חוזר; }} 

ניתן להפעיל את deserializer המותאם אישית הזה בדרך זו:

מחרוזת json = "{\" color \ ": \" שחור \ ", \" סוג \ ": \" BMW \ "}"; ממפה ObjectMapper = ObjectMapper חדש (); מודול SimpleModule = SimpleModule חדש ("CustomCarDeserializer", גרסה חדשה (1, 0, 0, null, null, null)); module.addDeserializer (Car.class, CustomCarDeserializer חדש ()); mapper.registerModule (מודול); מכונית רכב = mapper.readValue (json, Car.class); 

4.3. טיפול בתבניות תאריך

סידור ברירת המחדל של java.util.Date מייצר מספר, כלומר חותמת עידן (מספר אלפיות השנייה מאז 1 בינואר 1970, UTC). אך הדבר אינו קריא במיוחד עבור בני אדם ודורש הצגת המרה נוספת בפורמט קריא לאדם.

בואו נעטוף את אוטו מקרה שהשתמשנו בו עד כה בתוך בַּקָשָׁה שיעור עם תאריך רכישה תכונה:

שיעור ציבורי בקשה {רכב פרטי לרכב; תאריך תאריך פרטי רכישה; // מגדלי גטרים סטנדרטיים} 

כדי לשלוט בתבנית המחרוזת של תאריך ולהגדיר אותו, למשל, yyyy-MM-dd HH: mm a zשקול את הקטע הבא:

ObjectMapper objectMapper = ObjectMapper חדש (); DateFormat df = SimpleDateFormat חדש ("yyyy-MM-dd HH: mm a z"); objectMapper.setDateFormat (df); מחרוזת carAsString = objectMapper.writeValueAsString (בקשה); // פלט: {"car": {"color": "yellow", "type": "renault"}, "datePurchased": "2016-07-03 11:43 CEST"} 

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

4.4. טיפול באוספים

עוד תכונה קטנה אך שימושית הזמינה דרך התנערות תכונה מחלקה היא היכולת ליצור את סוג האוסף הרצוי מתגובת JSON Array.

לדוגמא, אנו יכולים ליצור את התוצאה כמערך:

מחרוזת jsonCarArray = "[{\" צבע \ ": \" שחור \ ", \" סוג \ ": \" BMW \ "}, {\" צבע \ ": \" אדום \ ", \" סוג \ ": \ "FIAT \"}] "; ObjectMapper objectMapper = ObjectMapper חדש (); objectMapper.configure (DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY, נכון); מכונית [] מכוניות = objectMapper.readValue (jsonCarArray, מכונית []. Class); // מכוניות דפוס

או כ רשימה:

מחרוזת jsonCarArray = "[{\" צבע \ ": \" שחור \ ", \" סוג \ ": \" BMW \ "}, {\" צבע \ ": \" אדום \ ", \" סוג \ ": \ "FIAT \"}] "; ObjectMapper objectMapper = ObjectMapper חדש (); List listCar = objectMapper.readValue (jsonCarArray, TypeReference חדש() {}); // מכוניות דפוס

מידע נוסף על טיפול באוספים עם ג'קסון זמין כאן.

5. מסקנה

ג'קסון היא ספריית JSON בסידור / עריקת ייצור מוצקה ובוגרת עבור Java. ה ObjectMapper API מספק דרך פשוטה לנתח וליצור אובייקטים של תגובת JSON עם הרבה גמישות. מאמר זה דן בתכונות העיקריות שהופכות את הספרייה לפופולארית כל כך.

את קוד המקור שמלווה את המאמר ניתן למצוא באתר GitHub.


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