המרת XML ל- JSON באמצעות ג'קסון

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

במדריך זה נראה כיצד להמיר הודעת XML ל- JSON באמצעות ג'קסון.

לקוראים חדשים בג'קסון, שקול להכיר קודם את היסודות.

2. מבוא לג'קסון

אנו יכולים לחשוב על ניתוח JSON בשלוש דרכים שונות עם ג'קסון:

  • הראשון והשכיח ביותר הוא קשירת נתונים עם ObjectMapper
  • השנייה היא מיפוי למבנה נתוני עץ עם TreeTraversingParser ו JsonNode
  • והשלישי הוא הזרמת מבנה נתוני העץ באמצעות אסימון, באמצעות JsonParser ו JsonGenerator

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

3. תלות

ראשית, עלינו להוסיף את jackson-databind תלות שלנו pom.xml:

 com.fasterxml.jackson.core jackson-databind 2.11.1 

ספרייה זו תאפשר לנו להשתמש בממשק ה- API של איגוד נתונים.

השנייה היא jackson-dataformat-xml שמוסיף את תמיכת ה- XML ​​של ג'קסון:

 com.fasterxml.jackson.dataformat jackson-dataformat-xml 2.11.1 

4. קשירת נתונים

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

כדי לחקור זאת, בואו נגדיר את ה- XML ​​שלנו עם פֶּרַח ו צֶבַע נכסים:

 פרג אדום 9 

זה דומה לסימון Java זה:

מעמד ציבורי פרח {פרטי מחרוזת פרטית; צבע צבע פרטי; עלי כותרת פרטיים שלמים; // getters and setter} ציבור ציבורי צבע {PINK, BLUE, YELLOW, RED; }

הצעד הראשון שלנו יהיה לנתח את ה- XML ​​ל- פֶּרַח למשל. לשם כך, בואו ליצור מופע של XmlMapper, המקבילה ל- XML ​​של ג'קסון עבור ObjectMapper והשתמש בה readValue שיטה:

XmlMapper xmlMapper = XmlMapper חדש (); פרג פרחים = xmlMapper.readValue (xml, Flower.class);

ברגע שיש לנו את שלנו פֶּרַח למשל, נרצה לכתוב את זה כ- JSON באמצעות המוכר ObjectMapper:

ממפה ObjectMapper = ObjectMapper חדש (); מחרוזת json = mapper.writeValueAsString (פרג);

וכתוצאה מכך אנו מקבלים את המקבילה JSON שלנו:

{"name": "פרג", "color": "RED", "petals": 9}

5. מעבר עץ

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

אם כי, כפי שנראה, זה מגיע עם כמה פשרות.

הצעד הראשון דומה לשלב הראשון שלנו כאשר אנו משתמשים בכריכת נתונים. הפעם, עם זאת, נשתמש ב- readTree שיטה:

XmlMapper xmlMapper = XmlMapper חדש (); צומת JsonNode = xmlMapper.readTree (xml.getBytes ());

לאחר שעשינו זאת, יהיה לנו JsonNode שיש לה 3 ילדים, כפי שציפינו: שם, צבע, ו עלי כותרת.

ואז נוכל להשתמש שוב ObjectMapper, פשוט שולח את שלנו JsonNode במקום:

ObjectMapper jsonMapper = ObjectMapper חדש (); מחרוזת json = jsonMapper.writeValueAsString (צומת);

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

{"name": "פרג", "color": "RED", "petals": "9"}

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

5.1. מגבלות

כמו כן, יש מגבלות מסוימות עם תמיכת מעבר XML של ג'קסון בעץ:

  • ג'קסון אינו יכול להבדיל בין אובייקט למערך. מכיוון ש- XML ​​חסר מבנים מקוריים כדי להבדיל בין אובייקט לרשימת אובייקטים, ג'קסון פשוט יאסוף אלמנטים חוזרים לערך יחיד.
  • ומכיוון שג'קסון רוצה למפות כל רכיב XML לצומת JSON, הוא אינו תומך בתוכן מעורב.

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

6. אילוצי זיכרון

כעת, לשני אלה יש את החיסרון הבולט ש- XML ​​כולו צריך להיות בזיכרון בבת אחת כדי לבצע את ההמרה. עד שג'קסון יתמוך בהזרמת מבנה העץ כאסימונים, אנו נתקע עם האילוץ הזה או שנצטרך להסתכל על גלגול משלנו עם משהו כמו XMLStreamReader.

7. מסקנה

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

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


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