Konverzija dokumenata BSON u JSON na Javi

Java Top

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Pregled

U ovom prethodnom članku vidjeli smo kako dohvatiti BSON dokumente kao Java objekte iz MongoDB-a.

Ovo je vrlo čest način za razvoj REST API-ja, jer bismo možda htjeli izmijeniti ove objekte prije pretvorbe u JSON (na primjer, koristeći Jackson).

Međutim, možda ne bismo željeli ništa promijeniti u svojim dokumentima. Da bismo nas spasili problema s kodiranjem detaljnog mapiranja Java objekata, možemo koristite izravnu pretvorbu BSON-a u JSON dokument.

Pogledajmo kako MongoDB BSON API radi za ovaj slučaj upotrebe.

2. Stvaranje BSON dokumenta u MongoDB-u s Morphiom

Prije svega, postavimo svoje ovisnosti pomoću Morphije kako je opisano u ovom članku.

Evo našeg primjeraentitet koji uključuje razne vrste atributa:

@Entity ("Books") knjiga javne klase {@Id private String isbn; @Embedded private Publisher izdavač; @Property ("price") privatni dvostruki trošak; @Property private LocalDateTime objaviteDate; // Dobavljači i postavljači ...}

Zatim stvorimo novi BSON entitet za naš test i spremimo ga u MongoDB:

javna klasa BsonToJsonIntegrationTest {privatni statički završni niz DB_NAME = "knjižnica"; privatna statička trgovina podataka Datastore; @BeforeClass public static void setUp () {Morphia morphia = nova Morphia (); morphia.mapPackage ("com.baeldung.morphia"); datastore = morphia.createDatastore (novi MongoClient (), DB_NAME); datastore.ensureIndexes (); datastore.save (new Book () .setIsbn ("isbn") .setCost (3.95) .setPublisher (new Publisher (new ObjectId ("fffffffffffffffffffffffa", "publisher")) .setPublishDate (LocalDateTime.parse ("2020-01 -01T18: 13: 32Z ", DateTimeFormatter.ISO_DATE_TIME)))); }}

3. Zadana pretvorba dokumenata BSON u JSON

Sada testirajmo zadanu pretvorbu koja je vrlo jednostavna: jednostavno nazovitetoJson metoda iz BSON-a Dokument razred:

@Test javna praznina givenBsonDocument_whenUsingStandardJsonTransformation_thenJsonDateIsObjectEpochTime () {String json = null; pokušajte (MongoClient mongoClient = novi MongoClient ()) {MongoDatabase mongoDatabase = mongoClient.getDatabase (DB_NAME); Dokument bson = mongoDatabase.getCollection ("Knjige"). Find (). First (); assertEquals (očekuje seJson, bson.toJson ()); }}

The očekivaoJson vrijednost je:

{"_id": "isbn", "className": "com.baeldung.morphia.domain.Book", "publisher": {"_id": {"$ oid": "fffffffffffffffffffffffa"}, "name": " izdavač "}," cijena ": 3,95," objavitiDatum ": {" $ datum ": 1577898812000}}

Čini se da ovo odgovara standardnom JSON mapiranju.

Međutim, to možemo vidjeti datum je prema zadanim postavkama pretvoren u objekt s $ datum polje u formatu epohe vremena. Pogledajmo sada kako možemo promijeniti ovaj format datuma.

4. Opuštena pretvorba BSON-a u JSON datum

Na primjer, ako želimo klasičniju ISO prezentaciju datuma (poput JavaScript klijenta), možemo proslijediti opušten JSON način rada na toJson metoda, koristeći JsonWriterSettings.builder:

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

Kao rezultat, možemo vidjeti objavitiDatum "opuštena" konverzija polja:

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

Čini se da je ovaj format točan, ali još uvijek imamo $ datum polje - da vidimo kako ga se riješiti pomoću prilagođenog pretvarača.

5. Prilagođena pretvorba datuma BSON u JSON

Prvo, moramo implementirati BSON Konverter sučelje za tip Dugo, jer su vrijednosti datuma izražene u milisekundama od epohe. Koristimo DateTimeFormatter.ISO_INSTANT da biste dobili očekivani izlazni format:

javna klasa JsonDateTimeConverter implementira Converter {private static final Logger LOGGER = LoggerFactory.getLogger (JsonDateTimeConverter.class); statički konačni DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ISO_INSTANT .withZone (ZoneId.of ("UTC")); @Override public void convert (Long value, StrictJsonWriter Writer) {try {Instant instant = novi datum (vrijednost) .toInstant (); Niz s = DATE_TIME_FORMATTER.format (trenutno); Writer.WriteString (s); } catch (Iznimka e) {LOGGER.error (String.format ("Nije uspjelo pretvoriti pomak% d u JSON datum", vrijednost), e); }}}

Zatim možemo proslijediti primjerak ove klase kao DateTime pretvarač u JsonWriterSettings graditelj:

bson.toJson (JsonWriterSettings .builder () .dateTimeConverter (novi JsonDateTimeConverter ()) .build ());

Napokon, stižemo običan JSON ISO format datuma:

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

6. Zaključak

U ovom smo članku vidjeli zadano ponašanje pretvorbe BSON u JSON dokument.

Istaknuli smo kako prilagodite format datuma, što je čest problem, koristeći BSON Konverter.

Naravno, možemo nastaviti na isti način pretvoriti druge vrste podataka: primjerice broj, logička, null vrijednost ili ID objekta.

Kao i uvijek, kod se može pronaći na GitHub-u.

Dno Java

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

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