BSON til JSON-dokumentkonvertering i Java

Java Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Oversigt

I denne tidligere artikel har vi set, hvordan man henter BSON-dokumenter som Java-objekter fra MongoDB.

Dette er en meget almindelig måde at udvikle en REST API på, da vi måske vil ændre disse objekter, før vi konverterer dem til JSON (f.eks. Ved hjælp af Jackson).

Vi vil dog muligvis ikke ændre noget til vores dokumenter. For at redde os besværet med at kode detaljerede kortlægning af Java-objekter kan vi bruge direkte BSON til JSON dokumentkonvertering.

Lad os se, hvordan MongoDB BSON API fungerer i denne brugssag.

2. Oprettelse af BSON-dokument i MongoDB med Morphia

Lad os først og fremmest konfigurere vores afhængigheder ved hjælp af Morphia som beskrevet i denne artikel.

Her er vores eksempelenhed, der indeholder forskellige attributtyper:

@Entity ("Bøger") offentlig klasse Bog {@Id privat streng isbn; @Embedded privat udgiver; @Property ("pris") private dobbeltomkostninger; @Property privat LocalDateTime publishDate; // Getters og setters ...}

Lad os derefter oprette en ny BSON-enhed til vores test og gemme den på MongoDB:

offentlig klasse BsonToJsonIntegrationTest {privat statisk endelig String DB_NAME = "bibliotek"; privat statisk Datastore datalager; @BeforeClass offentlig statisk ugyldig setUp () {Morphia morphia = ny Morphia (); morphia.mapPackage ("com.baeldung.morphia"); datastore = morphia.createDatastore (ny 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. Standardkonvertering af BSON til JSON-dokument

Lad os nu teste standardkonvertering, som er meget enkel: bare ringtilJson metode fra BSON Dokument klasse:

@Test offentlig ugyldighed givenBsonDocument_whenUsingStandardJsonTransformation_thenJsonDateIsObjectEpochTime () {String json = null; prøv (MongoClient mongoClient = ny MongoClient ()) {MongoDatabase mongoDatabase = mongoClient.getDatabase (DB_NAME); Dokument bson = mongoDatabase.getCollection ("Bøger"). Find (). Først (); assertEquals (forventetJson, bson.toJson ()); }}

Det forventede Json værdi er:

{"_id": "isbn", "className": "com.baeldung.morphia.domain.Book", "publisher": {"_id": {"$ oid": "fffffffffffffffffffffffa"}, "name": " udgiver "}," pris ": 3,95," publishDate ": {" $ date ": 1577898812000}}

Dette synes at svare til en standard JSON-kortlægning.

Det kan vi dog se datoen blev som standard konverteret som et objekt med en $ dato felt i tidsperiode. Lad os se nu, hvordan vi kan ændre dette datoformat.

4. Afslappet BSON til JSON dato konvertering

For eksempel, hvis vi ønsker en mere klassisk ISO-datorepræsentation (f.eks. For en JavaScript-klient), kan vi videregive afslappet JSON-tilstand til tilJson metode ved hjælp af JsonWriterSettings.builder:

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

Som et resultat kan vi se publishDate feltets "afslappede" konvertering:

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

Dette format virker korrekt, men vi har stadig det $ dato felt - lad os se, hvordan vi kan slippe af med en brugerdefineret konverter.

5. Brugerdefineret konvertering af BSON til JSON-dato

Først skal vi implementere BSON Konverter interface for type Lang, da datoværdier er udtrykt i millisekunder siden epoke-tid. Vi bruger DateTimeFormatter.ISO_INSTANT for at få det forventede outputformat:

offentlig klasse JsonDateTimeConverter implementerer Converter {privat statisk endelig Logger LOGGER = LoggerFactory.getLogger (JsonDateTimeConverter.class); statisk endelig DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ISO_INSTANT .withZone (ZoneId.of ("UTC")); @Override offentlig ugyldig konvertering (lang værdi, StrictJsonWriter-forfatter) {prøv {Øjeblikkelig øjeblikkelig = ny dato (værdi) .toInstant (); Streng s = DATE_TIME_FORMATTER.format (øjeblikkelig); writer.writeString (s); } fange (Undtagelse e) {LOGGER.error (String.format ("Kunne ikke konvertere forskydning% d til JSON-dato", værdi), e); }}}

Derefter kan vi passere en forekomst af denne klasse som en DateTime-konverter til JsonWriterSettings Bygger:

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

Endelig får vi det et almindeligt JSON ISO-datoformat:

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

6. Konklusion

I denne artikel har vi set standardopførelsen af ​​BSON til JSON-dokumentkonvertering.

Vi fremhævede, hvordan man gør det tilpas datoformatet, som er et almindeligt problem ved hjælp af BSON Konverter.

Selvfølgelig, vi kan fortsætte på samme måde for at konvertere andre datatyper: for eksempel nummer, boolsk, nulværdi eller objekt-id.

Som altid kan koden findes på GitHub.

Java bund

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN