מבוא ל- JSON Binding API (JSR 367) ב- Java

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

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

לאחרונה, Java EE7 הגיע עם API לניתוח והפקת JSON (JSR 353: Java API לעיבוד JSON).

ולבסוף, עם שחרורו של JEE 8, יש ממשק API סטנדרטי (JSR 367: Java API for JSON Binding (JSON-B)).

לעת עתה, היישומים העיקריים שלה הם Eclipse Yasson (RI) ו- Apache Johnzon.

2. API של JSON-B

2.1. תלות של Maven

נתחיל בהוספת התלות הדרושה.

זכור כי במקרים רבים זה יספיק לכלול את התלות ליישום שנבחר ואת ה- javax.json.bind-api ייכלל באופן מעברי:

 javax.json.bind javax.json.bind-api 1.0 

ניתן למצוא את הגרסה האחרונה ב- Maven Central.

3. שימוש בליקוי חסון

Eclipse Yasson הוא יישום הפניה הרשמי של JSON Binding API (JSR-367).

3.1. תלות של Maven

כדי להשתמש בו, עלינו לכלול את התלות הבאה בפרויקט Maven שלנו:

 org.eclipse yasson 1.0.1 org.glassfish javax.json 1.1.2 

ניתן למצוא את הגרסאות האחרונות ב- Maven Central.

4. שימוש באפצ'י ג'ונסון

יישום נוסף בו אנו יכולים להשתמש הוא אפאצ'י ג'ונסון העומד בתנאי ה- API של JSON-P (JSR-353) ו- JSON-B (JSR-367).

4.1. תלות של Maven

כדי להשתמש בו, עלינו לכלול את התלות הבאה בפרויקט Maven שלנו:

 org.apache.geronimo.specs geronimo-json_1.1_spec 1.0 org.apache.johnzon johnzon-jsonb 1.1.4 

ניתן למצוא את הגרסאות האחרונות ב- Maven Central.

5. תכונות API

ממשק ה- API מספק הערות להתאמה אישית של סידור / דה-ריאליזציה.

בואו ליצור מחלקה פשוטה ונראה איך תצורת הדוגמה נראית:

אדם בכיתה ציבורית {מזהה פרטי פרטי; @JsonbProperty ("שם אדם") שם פרטי מחרוזת; דוא"ל מחרוזת פרטי @JsonbProperty (nillable = true); גיל אינטנסיבי פרטי @JsonbTransient; @JsonbDateFormat ("dd-MM-yyyy") LocalDate פרטי תאריך; משכורת פרטית של BigDecimal; @JsonbNumberFormat (locale = "en_US", value = "# 0.0") BigDecimal ציבורי getSalary () {משכורת תמורה; } // גטרים וקובעים סטנדרטיים}

לאחר סדרת סדר, אובייקט ממעמד זה ייראה כך:

{"email": "[email protected]", "id": 1, "person-name": "Jhon", "registeredDate": "07-09-2019", "משכורת": "1000.0"}

ההערות המשמשות כאן הן:

  • @JsonbProperty - המשמש לציון שם שדה מותאם אישית
  • @JsonbTransient - כשאנחנו רוצים להתעלם מהשדה במהלך עריכה / סידור
  • @JsonbDateFormat - כאשר אנו רוצים להגדיר את פורמט התצוגה של התאריך
  • @JsonbNumberFormat - לציון פורמט התצוגה לערכים מספריים
  • @JsonbNillable - לאפשר סדרת ערכי null

5.1. סידור ועריקול

ראשית כל, כדי להשיג את ייצוג JSON של האובייקט שלנו, עלינו להשתמש ב- JsonbBuilder הכיתה שלה toJson () שיטה.

כדי להתחיל, בואו ליצור פשוט אדם חפץ כזה:

אדם אדם = אדם חדש (1, "Jhon", "[email protected]", 20, LocalDate.of (2019, 9, 7), BigDecimal.valueOf (1000));

ו, מיידי את ג'סונב מעמד:

Jsonb jsonb = JsonbBuilder.create ();

ואז, אנו משתמשים ב- toJson שיטה:

מחרוזת jsonPerson = jsonb.toJson (אדם);

כדי להשיג את ייצוג JSON הבא:

{"email": "[email protected]", "id": 1, "person-name": "Jhon", "registeredDate": "07-09-2019", "משכורת": "1000.0"}

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

אדם אדם = jsonb.fromJson (jsonPerson, Person.class);

באופן טבעי, אנו יכולים גם לעבד אוספים:

רשימת personList = Arrays.asList (...); מחרוזת jsonArrayPerson = jsonb.toJson (personList);

כדי להשיג את ייצוג JSON הבא:

[{"email": "[email protected]", "id": 1, "person-name": "Jhon", "registeredDate": "09-09-2019", "משכורת": "1000.0"}, {"email": "[email protected]", "id": 2, "person-name": "Jhon", "registeredDate": "09-09-2019", "משכורת": "1500.0"},. ..]

להמיר ממערך JSON ל רשימה נשתמש ב- מג'ייסון ממשק API:

רשימת personList = jsonb.fromJson (personJsonArray, ArrayList חדש () {}. GetClass (). GetGenericSuperclass ());

5.2. מיפוי מותאם אישית עם JsonbConfig

ה JsonbConfig class מאפשר לנו להתאים אישית את תהליך המיפוי לכל הכיתות.

לדוגמא, אנו יכולים לשנות את אסטרטגיות שמות ברירת המחדל או את סדר המאפיינים.

כעת, נשתמש ב- LOWER_CASE_WITH_UNDERSCORES אִסטרָטֶגִיָה:

JsonbConfig config = JsonbConfig חדש (). WithPropertyNamingStrategy (PropertyNamingStrategy.LOWER_CASE_WITH_UNDERSCORES); Jsonb jsonb = JsonbBuilder.create (config); מחרוזת jsonPerson = jsonb.toJson (אדם);

כדי להשיג את ייצוג JSON הבא:

{"email": "[email protected]", "id": 1, "person-name": "Jhon", "registered_date": "07-09-2019", "משכורת": "1000.0"}

כעת נשנה את סדר הנכסים באמצעות ה- לַהֲפוֹך אִסטרָטֶגִיָה. באמצעות אסטרטגיה זו, סדר המאפיינים הוא בסדר הפוך לסדר הלקסיקוגרפי.

ניתן להגדיר זאת גם בזמן ההידור עם ההערה @JsonbPropertyOrder. בואו נראה את זה בפעולה:

JsonbConfig config = חדש JsonbConfig (). WithPropertyOrderStrategy (PropertyOrderStrategy.REVERSE); Jsonb jsonb = JsonbBuilder.create (config); מחרוזת jsonPerson = jsonb.toJson (אדם); 

כדי להשיג את ייצוג JSON הבא:

{"משכורת": "1000.0", "registeredDate": "07-09-2019", "person-name": "Jhon", "id": 1, "email": "[דוא"ל מוגן]"}

5.3. מיפוי מותאם אישית עם מתאמים

כאשר ההערות וה- JsonbConfig בכיתה לא מספיקים לנו, אנחנו יכולים להשתמש במתאמים.

כדי להשתמש בהם, נצטרך ליישם את ה- מתאם Jsonb ממשק, המגדיר את השיטות הבאות:

  • adaptToJson - בשיטה זו אנו יכולים להשתמש בהיגיון המרות מותאם אישית לתהליך הסידור.
  • adaptFromJson - שיטה זו מאפשרת לנו להשתמש בלוגיקת ההמרה המותאמת אישית לתהליך עריקת השינוי.

בואו ניצור a מתאם אישי לעבד את תְעוּדַת זֶהוּת ו שֵׁם תכונות של אדם מעמד:

מחלקה ציבורית PersonAdapter מיישמת את JsonbAdapter {@Override public JsonObject adaptToJson (Person p) זורק Exception {return Json.createObjectBuilder () .add ("id", p.getId ()) .add ("name", p.getName ()) .לִבנוֹת(); } @Override אדם ציבורי adaptFromJson (JsonObject מותאם) זורק חריג {אדם אדם = אדם חדש (); person.setId (adapt.getInt ("id")); person.setName (adapted.getString ("שם")); אדם חוזר; }}

יתר על כן, נקצה את המתאם שלנו JsonbConfig למשל:

JsonbConfig config = חדש JsonbConfig (). WithAdapters (PersonAdapter חדש ()); Jsonb jsonb = JsonbBuilder.create (config);

ונקבל את ייצוג JSON הבא:

{"id": 1, "name": "Jhon"}

6. מסקנה

במדריך זה ראינו דוגמה כיצד לשלב את ה- JSON-B API עם יישומי Java באמצעות היישומים הזמינים, יחד עם דוגמאות להתאמה אישית של סידור וסילוק בין ערוצים והן בזמן ריצה.

הקוד השלם זמין, כמו תמיד, ב- Github.


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