BSON - JSON dokumentumkonvertálás Java-ban

Java Top

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT

1. Áttekintés

Ebben az előző cikkben azt láttuk, hogyan lehet a BSON dokumentumokat Java objektumokként letölteni a MongoDB-ből.

Ez egy nagyon elterjedt módszer a REST API fejlesztésére, mivel ezeket az objektumokat érdemes módosítani, mielőtt JSON-vá konvertálnánk őket (például Jackson segítségével).

Előfordulhat azonban, hogy nem akarunk semmit megváltoztatni a dokumentumainkon. A bonyolult Java objektumok leképezésének kódolásával kapcsolatos problémák elkerülése érdekében megtehetjük használja a közvetlen BSON-JSON dokumentumkonvertálást.

Nézzük meg, hogyan működik a MongoDB BSON API ebben a felhasználási esetben.

2. BSON dokumentum létrehozása MongoDB-ben Morphiával

Először állítsuk be függőségeinket a Morphia használatával, a cikkben leírtak szerint.

Itt van a mi példánkkülönféle attribútumtípusokat tartalmazó entitás:

@Entity ("Könyvek") public class Book {@Id private String isbn; @ Beágyazott magánkiadói kiadó; @Tulajdon ("ár") magán kettős költség; @Property private LocalDateTime publishDate; // Getters and setters ...}

Ezután hozzunk létre egy új BSON entitást a tesztünkhöz, és mentsük el a MongoDB-be:

public class BsonToJsonIntegrationTest {private static final String DB_NAME = "könyvtár"; privát statikus Datastore datastore; @BeforeClass public static void setUp () {Morphia morphia = new Morphia (); morphia.mapPackage ("com.baeldung.morphia"); datastore = morphia.createDatastore (új MongoClient (), DB_NAME); datastore.ensureIndexes (); datastore.save (új könyv () .setIsbn ("isbn") .setCost (3.95) .setPublisher (új Publisher (új ObjectId ("fffffffffffffffffffffffa"), "Publisher")) .setPublishDate (LocalDateTime.parse ("2020-01) -01T18: 13: 32Z ", DateTimeFormatter.ISO_DATE_TIME))); }}

3. Alapértelmezett BSON - JSON dokumentumkonvertálás

Most teszteljük az alapértelmezett konverziót, amely nagyon egyszerű: egyszerűen hívjonJsonnak módszer a BSON-tól Dokumentum osztály:

@Test public void givenBsonDocument_whenUsingStandardJsonTransformation_thenJsonDateIsObjectEpochTime () {String json = null; try (MongoClient mongoClient = new MongoClient ()) {MongoDatabase mongoDatabase = mongoClient.getDatabase (DB_NAME); Dokumentum bson = mongoDatabase.getCollection ("Könyvek"). Find (). First (); assertEquals (várhatóJson, bson.toJson ()); }}

A várhatóJson értéke:

{"_id": "isbn", "className": "com.baeldung.morphia.domain.Book", "publisher": {"_id": {"$ oid": "fffffffffffffffffffffffa"}, "név": " kiadó "}," price ": 3,95," publishDate ": {" $ date ": 1577898812000}}

Úgy tűnik, hogy ez megfelel egy szokásos JSON-leképezésnek.

Ezt azonban láthatjuk a dátum alapértelmezés szerint objektummá lett konvertálva a-val $ date mező korszakos időformátumban. Nézzük meg, hogyan változtathatjuk meg ezt a dátumformátumot.

4. Relaxálta a BSON-t a JSON-dátumkonverzióvá

Például, ha klasszikusabb ISO dátum-ábrázolást akarunk (például egy JavaScript kliens esetében), akkor átadhatjuk a kipihent JSON mód a Jsonnak módszerrel JsonWriterSettings.builder:

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

Ennek eredményeként láthatjuk a publishDate mező „nyugodt” konverziója:

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

Ez a formátum helyesnek tűnik, de még mindig megvan a $ date mező - nézzük meg, hogyan lehet megszabadulni tőle egy egyedi átalakító segítségével.

5. Egyéni BSON - JSON dátumkonvertálás

Először is meg kell valósítanunk a BSON Átalakító felület típushoz Hosszú, mivel a dátumértékek milliszekundumban vannak kifejezve a korszak óta. Használjuk DateTimeFormatter.ISO_INSTANT a várt kimeneti formátum megszerzéséhez:

public class JsonDateTimeConverter implementálja a Converter {private static final Logger LOGGER = LoggerFactory.getLogger (JsonDateTimeConverter.class); statikus végső DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ISO_INSTANT .withZone (ZoneId.of ("UTC")); @Orride public void convert (Long value, StrictJsonWriter író) {próbáld ki az {Instant instant = new Date (value) .toInstant (); String s = DATE_TIME_FORMATTER.formátum (azonnali); író.írásiString (ek); } catch (e kivétel) {LOGGER.error (String.format ("Nem sikerült a% d eltolást konvertálni JSON dátumra, érték), e); }}}

Ezután átadhatunk ennek az osztálynak egy példányát mint DateTime konverter a JsonWriterSettings építész:

bson.toJson (JsonWriterSettings .builder () .dateTimeConverter (új JsonDateTimeConverter ()) .build ());

Végül megkapjuk sima JSON ISO dátumformátum:

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

6. Következtetés

Ebben a cikkben láthattuk a BSON-JSON dokumentumkonvertálás alapértelmezett viselkedését.

Kiemeltük, hogyan kell testreszabhatja a dátumformátumot, amely gyakori probléma, a BSON használatával Átalakító.

Természetesen, ugyanúgy járhatunk el más adattípusok átalakítására is: például szám, logikai érték, nullérték vagy objektumazonosító.

Mint mindig, a kód megtalálható a GitHubon.

Java alsó

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT

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