BSON - JSON dokumentumkonvertálás Java-ban
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 FOLYAMATOT1. Á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ó