המרת מסמכים BSON ל- JSON בג'אווה

ג'אווה טופ

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

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

במאמר הקודם ראינו כיצד לאחזר מסמכי BSON כאובייקטים של Java מ- MongoDB.

זוהי דרך נפוצה מאוד לפיתוח REST API, מכיוון שנרצה לשנות את האובייקטים הללו לפני להמיר אותם ל- JSON (באמצעות ג'קסון למשל).

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

בואו נראה איך MongoDB BSON API עובד למקרה שימוש זה.

2. יצירת מסמכים של BSON ב- MongoDB עם מורפיה

ראשית, בואו להגדיר את התלות שלנו באמצעות מורפיה כמתואר במאמר זה.

הנה הדוגמה שלנוישות הכוללת סוגי מאפיינים שונים:

@Entity ("ספרים") ספר בכיתה ציבורית {@Id פרטי מחרוזת isbn; מו"ל מפרסם פרטי משובץ; @Property ("מחיר") עלות כפולה פרטית; @Property פרטי LocalDateTime publishDate; // גטרים וקובעים ...}

אז בואו ליצור ישות BSON חדשה לבדיקה שלנו ונשמור אותה ב- MongoDB:

מחלקה ציבורית BsonToJsonIntegrationTest {סופי סטטי פרטי פרטי מחרוזת DB_NAME = "ספרייה"; חנות נתונים סטטית פרטית; @BeforeClass סטטוס ריק סטטי ציבורי () {מורפיה מורפיה = מורפיה חדשה (); morphia.mapPackage ("com.baeldung.morphia"); חנות נתונים = morphia.createDatastore (MongoClient חדש (), DB_NAME); datastore.ensureIndexes (); datastore.save (ספר חדש () .setIsbn ("isbn") .setCost (3.95) .setPublisher (מוציא לאור חדש (ObjectId חדש ("fffffffffffffffffffffffa"), "מו"ל")). setPublishDate (LocalDateTime.parse ("2020-01 -01T18: 13: 32Z ", DateTimeFormatter.ISO_DATE_TIME))); }}

3. ברירת מחדל של המרת מסמך BSON ל- JSON

עכשיו בואו לבדוק את המרת ברירת המחדל שהיא מאוד פשוטה: פשוט להתקשרtoJson שיטה מ- BSON מסמך מעמד:

@Test public void givenBsonDocument_whenUsingStandardJsonTransformation_thenJsonDateIsObjectEpochTime () {String json = null; נסה (MongoClient mongoClient = MongoClient חדש ()) {MongoDatabase mongoDatabase = mongoClient.getDatabase (DB_NAME); מסמך bson = mongoDatabase.getCollection ("ספרים"). מצא (). ראשון (); assertEquals (expectJson, bson.toJson ()); }}

ה צפוי ג'סון הערך הוא:

{"_id": "isbn", "className": "com.baeldung.morphia.domain.Book", "publisher": {"_id": {"$ oid": "fffffffffffffffffffffffa"}, "name": " מו"ל "}," price ": 3.95," publishDate ": {" $ date ": 1577898812000}}

נראה שזה תואם למיפוי JSON רגיל.

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

4. המרת BSON ל- JSON תאריך רגוע

למשל, אם אנו רוצים ייצוג תאריכים קלאסי יותר של ISO (כגון עבור לקוח JavaScript), נוכל להעביר את ה- רָגוּעַ מצב JSON אל toJson שיטה, באמצעות JsonWriterSettings.builder:

bson.toJson (JsonWriterSettings .builder () .outputMode (JsonMode.RELAXED) .build ());

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

{... "publishDate": {"$ date": "2020-01-01T17: 13: 32Z"} ...}

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

5. המרת BSON ל- JSON התאמה אישית

ראשית, עלינו ליישם את BSON מֵמִיר מִמְשָׁק לסוג ארוך, כאשר ערכי התאריך באים לידי ביטוי באלפיות השנייה מאז תקופת העידן. אנחנו משתמשים DateTimeFormatter.ISO_INSTANT כדי לקבל את פורמט הפלט הצפוי:

מחלקה ציבורית JsonDateTimeConverter מיישם ממיר {לוגר סופי סטטי פרטי LOGGER = LoggerFactory.getLogger (JsonDateTimeConverter.class); סופי סטטי DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ISO_INSTANT .withZone (ZoneId.of ("UTC")); @ החלף המרה בטלנית ציבורית (ערך ארוך, כותב StrictJsonWriter) {נסה {Instant instant = תאריך חדש (ערך) .toInstant (); מחרוזת s = DATE_TIME_FORMATTER.format (מיידי); writer.writeString (s); } לתפוס (חריג e) {LOGGER.error (String.format ("נכשל בהמרת קיזוז% d לתאריך JSON", ערך), e); }}}

ואז נוכל להעביר מופע של מעמד זה כממיר DateTime ל- הגדרות JsonWriter בּוֹנֶה:

bson.toJson (JsonWriterSettings .builder () .dateTimeConverter (חדש JsonDateTimeConverter ()) .build ());

לבסוף, אנחנו מקבלים פורמט תאריך רגיל של JSON ISO:

{... "publishDate": "2020-01-01T17: 13: 32Z" ...}

6. מסקנה

במאמר זה ראינו את התנהגות ברירת המחדל של המרת מסמכים BSON ל- JSON.

הדגשנו כיצד התאם אישית את פורמט התאריך, שהוא נושא נפוץ, באמצעות BSON מֵמִיר.

כמובן, אנו יכולים להמשיך באותה דרך להמיר סוגי נתונים אחרים: מספר, בוליאני, ערך null או מזהה אובייקט, למשל.

כמו תמיד, ניתן למצוא את הקוד ב- GitHub.

תחתית Java

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

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