Jackson נגד Gson: מקרים קצה בניתוח JSON עבור אפליקציות Java

JSON (Javascript Object Notation) הוא אוסף של זוגות מפתח-ערך שניתן לנתח וליצור בקלות על ידי אפליקציות. זהו תת-קבוצה של סטנדרט לשפת תכנות JavaScript ECMA-262. הנתיחה של JSON נדרשת ברוב האפליקציות, כגון APIים רסטפוליים או אפליקציות שזקוקות לסדרת נתונים.

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

סקירה קצרה של Jackson ו-Gson

Jackson

Jackson פותחה על ידי FasterXML ומשמשת באפליקציות עסקיות וסביבות כמו Spring Boot. היא מציעה נתיחה, סדרת נתונים והדמיה של נתוני JSON. המאפיינים הבאים הופכים את הספרייה הזו לפופולרית בקרב המפתחים:

  1. Jackson היא הספריית הברירת מחדל לעיבוד JSON ב-Spring Boot, וכך מסירה הצורך בהגדרה ידנית ברוב המקרים.
  2. היא מקלה על פירוק JSON לטיפוסים גנריים באמצעות TypeReference או JavaType.
  3. היא מספקת אננוטציות שונות להתאמה אישית של התנהגות ההדמיה והנתיחה. לדוגמה, @JsonProperty(name) יוצר קישור בין המפתח הנכנס ושדה ה-Java POJO הממשי.
  4. הוא מספק תמיכה רחבה וחזקה ל- Bidirectional Databinding (JSON ל- POJO ולהיפך), Streaming API (ה- API קורא JSON ל- POJO) ולניתוח דגם עץ (מפה בזיכרון של אובייקטים JSON).
  5. ספריית Jackson מציעה ביצועים גבוהים תוך כדי הפחתת עלות הזיכרון ואופטימיזציה של סידור/הנדות (מ- JSON ל- POJO ולהיפך).
  6. Jackson תומך במודולים נוספים כגון עיבוד XML, YAML ושיפורים ספציפיים ל- Kotlin, scala.
  7. אנוטציות כמו @JsonTypeInfo ו- @JsonSubTypes עוסקות בסוגיות פולימורפיות.
  8. היא עוסקת בשדות חסרים או נוספים בנתוני JSON עקב תאימות לאחור ולקדימה.
  9. Jackson מספקת תמיכה באובייקטים לא ניתנים לשינוי ובמחלקות עם בנאים, כולל אלה שמשתמשות בתבנית בנאי.
  10. מחלקת ObjectMapper היא תכנית בטוחה לשימוש בתהליכי רצף ולכן מאפשרת שימוש יעיל ביישומים רבי תהליכים.

Gson

Gson פותח על ידי Google ונועד להמרת JSON לאובייקטי Java (POJO) ולהיפך. זהו כלי פשוט ואידיאלי לשימוש ביישומים קטנים שזקוקים ליישומים מהירים. הספרייה הפתוחה מציעה את התכונות המרכזיות הבאות:

  1. ל-Gson יש תלות חיצונית מינימלית; לכן זה קל לשלב.
  2. הוא תומך באובייקטים מקוננים ובסוגי נתונים מורכבים כגון רשימות, מפות ומחלקות מותאמות.
  3. ניתן להפוך JSON לאוספים גנריים כמו List<T>, Map<K,V> באמצעות TypeToken.
  4. ממשקי JsonSerializer ו־JsonDeserializer של ספריית Gson מאפשרים יישום מותאם אישית.
  5. ערכי null מיוצאים מבלי לכלול בפלט של JSON כברירת מחדל, ואם נדרש, ניתן לכלול ערכי null בפלט.
  6. האנוטציות @SerializedName מMapping בין מפתחות JSON לשדות Java עם שמות שונים.
  7. אובייקטי Gson הם thread-safe ולכן ניתן להשתמש בהם ביישומים שעובדים ברקע מרובה.
  8. המחלקה GsonBuilder יכולה להחיל מדיניות שינוי שמות מותאמת אישית עבור שדות. לדוגמה, FieldNamingPolicy.IDENTITY היא המדיניות הברירת מחדל, שמשמעה ששם השדה נשמר ללא שינוי.

מקרים קצה שנלקחו בחשבון בהשוואה זו

Feature Jackson GSON

שדות נוספים

נתמך כברירת מחדל, ניתן להגדיר.

נתמך כברירת מחדל.

ערכי null

תומך ב־@JsonInclude.

דורש .serializeNulls().

התייחסויות מעגליות

נתמך באמצעות @JsonIdentityInfo.

לא נתמך ישירות.

טיפול בנתונים

תומך ב-Java 8 Date API עם מודולים.

דורש מתאמי טיפוס מותאמים אישית.

פולימורפיזם

מובנה עם @JsonTypeInfo.

דורש בקרת פירוש מותאמת אישית.

ה-JSON הקלט שנחשב להשוואה עם ספריות Jackson ו-Gson נמצא ב-GitHub.

ישנה ייצוג מודל של ה-JSON ב-GitHub.

יישום Jackson

ה-JSON שנזכר לעיל מומר לאובייקט Java באמצעות ספריות Jackson שבהן:

XML

 

מחלץ JSON במחלקת main באמצעות ספריית Jackson:

Java

 

הפלט של המחלקה לעיל הוא כדלקמן:

יישום Gson

התלות ב-Gson שנעשה שימוש בה כדי להמיר את ה-JSON לאובייקט Java היא בתחתית:

XML

 

פירוק JSON באמצעות ספריית GSON במחלקת main:

Java

 

הפלט של מחלקת main לעיל הוא כדלקמן:

לאיזה אחד אני צריך לבחור?

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

מסקנה

שתי הספריות יכולות לעסוק בקבוצת הנתונים לעיל בצורה יעילה והן מצוינות בעיבוד המרה של JSON ב-JAVA. ההשוואה שנאמרה לעיל עוזרת לבחור את הספרייה הנכונה בהתאם לדרישות הפרויקט.

חלקי הקוד שנאמרו לעיל זמינים ב-מאגר הקוד של GitHub.

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

Source:
https://dzone.com/articles/jackson-vs-gson-edge-cases-json-parsing-java