Konverzia dokumentov BSON na JSON v Jave

Java Top

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

1. Prehľad

V tomto predchádzajúcom článku sme videli, ako načítať dokumenty BSON ako objekty Java z MongoDB.

Toto je veľmi častý spôsob vývoja REST API, pretože tieto objekty môžeme chcieť upraviť skôr, ako ich prevedieme do formátu JSON (napríklad pomocou Jacksona).

Možno však nebudeme chcieť na svojich dokumentoch nič meniť. Aby sme si ušetrili problém s programovaním podrobných mapovaní objektov Java, môžeme používať priamu konverziu dokumentov BSON na JSON.

Pozrime sa, ako funguje MongoDB BSON API pre tento prípad použitia.

2. Vytváranie BSON dokumentov v MongoDB s Morphia

Najskôr si nastavíme naše závislosti pomocou Morphie, ako je popísané v tomto článku.

Tu je náš príkladentita, ktorá obsahuje rôzne typy atribútov:

@Entity („Knihy“) verejná trieda Kniha {@Id private String isbn; @Embedded private Publisher vydavateľ; @ Vlastnosť („cena“) súkromné ​​dvojnásobné náklady; @ Vlastnosť private LocalDateTime publishDate; // Zakladatelia a zakladatelia ...}

Potom pre náš test vytvoríme novú entitu BSON a uložíme ju do MongoDB:

public class BsonToJsonIntegrationTest {private static final String DB_NAME = "library"; súkromné ​​statické úložisko údajov; @BeforeClass public static void setUp () {Morphia morphia = nová Morphia (); morphia.mapPackage ("com.baeldung.morphia"); datastore = morphia.createDatastore (nový MongoClient (), DB_NAME); datastore.ensureIndexes (); datastore.save (new Book () .setIsbn ("isbn") .setCost (3,95) .setPublisher (new Publisher (new ObjectId ("fffffffffffffffffffffffffa"), "publisher")) .setPublishDate (LocalDateTime.parse ("2020-01) -01T18: 13: 32Z ", DateTimeFormatter.ISO_DATE_TIME))); }}

3. Predvolená konverzia dokumentu BSON na JSON

Teraz otestujme predvolenú konverziu, ktorá je veľmi jednoduchá: jednoducho zavolajtetoJson metóda z BSON Dokument trieda:

@Test public void givenBsonDocument_whenUsingStandardJsonTransformation_thenJsonDateIsObjectEpochTime () {String json = null; try (MongoClient mongoClient = nový MongoClient ()) {MongoDatabase mongoDatabase = mongoClient.getDatabase (DB_NAME); Document bson = mongoDatabase.getCollection ("Knihy"). Find (). First (); assertEquals (expectJson, bson.toJson ()); }}

The očakávanýJson hodnota je:

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

Zdá sa, že to zodpovedá štandardnému mapovaniu JSON.

To však vidíme dátum bol štandardne prevedený ako objekt s a $ dátum pole vo formáte epochy. Pozrime sa teraz, ako môžeme zmeniť tento formát dátumu.

4. Uvoľnená konverzia dátumu BSON na JSON

Napríklad, ak chceme klasickejšiu reprezentáciu dátumu ISO (napríklad pre klienta JavaScript), môžeme odovzdať znak uvoľnene Režim JSON do toJson metóda, pomocou JsonWriterSettings.builder:

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

Vo výsledku môžeme vidieť publishDate „uvoľnená“ konverzia poľa:

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

Tento formát sa zdá byť správny, ale stále máme $ dátum pole - pozrime sa, ako sa ho zbaviť pomocou vlastného prevodníka.

5. Vlastná konverzia dátumu BSON na JSON

Najskôr musíme implementovať BSON Prevádzač rozhranie pre typ Dlhé, pretože hodnoty dátumu sú vyjadrené v milisekundách od epochy. Používame DateTimeFormatter.ISO_INSTANT získať očakávaný výstupný formát:

public class JsonDateTimeConverter implementuje Converter {private static final Logger LOGGER = LoggerFactory.getLogger (JsonDateTimeConverter.class); static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ISO_INSTANT .withZone (ZoneId.of ("UTC")); @Override public void convert (Long value, StrictJsonWriter writer) {try {Instant instant = new Date (value) .toInstant (); Reťazec s = DATE_TIME_FORMATTER.format (okamžitý); writer.writeString (s); } catch (Výnimka e) {LOGGER.error (String.format ("Nepodarilo sa previesť posun% d na dátum JSON", hodnota), e); }}}

Potom môžeme odovzdať inštanciu tejto triedy ako prevodník dátumu a času do JsonWriterSettings staviteľ:

bson.toJson (JsonWriterSettings .builder () .dateTimeConverter (nový JsonDateTimeConverter ()) .build ());

Nakoniec sa dočkáme obyčajný formát dátumu JSON ISO:

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

6. Záver

V tomto článku sme videli predvolené správanie konverzie dokumentov BSON na JSON.

Zdôraznili sme, ako na to prispôsobte formát dátumu, ktorý je častým problémom, pomocou BSON Prevádzač.

Samozrejme, rovnakým spôsobom môžeme postupovať pri prevode ďalších dátových typov: číslo, boolovská hodnota, nulová hodnota alebo napríklad ID objektu.

Ako vždy, kód nájdete na GitHub.

Java dole

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ