BSON til JSON Document Conversion i Java

Java Top

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

1. Oversikt

I denne forrige artikkelen har vi sett hvordan du kan hente BSON-dokumenter som Java-objekter fra MongoDB.

Dette er en veldig vanlig måte å utvikle et REST API på, da vi kanskje vil endre disse objektene før vi konverterer dem til JSON (for eksempel ved bruk av Jackson).

Imidlertid vil vi kanskje ikke endre noe i dokumentene våre. For å spare oss for bryet med å kode detaljerte kartlegging av Java-objekter, kan vi bruker direkte BSON til JSON dokumentkonvertering.

La oss se hvordan MongoDB BSON API fungerer for denne brukssaken.

2. BSON Document Creation i MongoDB med Morphia

Først av alt, la oss sette opp våre avhengigheter ved hjelp av Morphia som beskrevet i denne artikkelen.

Her er vårt eksempelenhet som inkluderer forskjellige attributtyper:

@Entity ("Books") public class Book {@Id private String isbn; @Embedded private Publisher-utgivere; @Property ("pris") privat dobbel kostnad; @Property private LocalDateTime publishDate; // Getter og setter ...}

La oss så opprette en ny BSON-enhet for testen vår og lagre den på MongoDB:

offentlig klasse BsonToJsonIntegrationTest {private static final String DB_NAME = "library"; privat statisk Datastore datalager; @BeforeClass public static void setUp () {Morphia morphia = new Morphia (); morphia.mapPackage ("com.baeldung.morphia"); datalager = 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 av BSON til JSON

La oss nå teste standardkonvertering som er veldig enkel: bare ringtoJson metode fra BSON Dokument klasse:

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

De forventet Json verdien er:

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

Dette ser ut til å samsvare med en standard JSON-kartlegging.

Imidlertid kan vi se det datoen ble konvertert som standard som et objekt med en $ dato felt i tidsperiode. La oss nå se hvordan vi kan endre dette datoformatet.

4. Avslappet BSON til JSON dato konvertering

For eksempel, hvis vi ønsker en mer klassisk ISO-datorepresentasjon (for eksempel for en JavaScript-klient), kan vi passere avslappet JSON-modus til toJson metode, ved hjelp av JsonWriterSettings.builder:

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

Som et resultat kan vi se publishDate feltets “avslappede” konvertering:

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

Dette formatet virker riktig, men vi har fortsatt $ dato felt - la oss se hvordan vi kan bli kvitt det ved hjelp av en tilpasset omformer.

5. Tilpasset BSON til JSON dato konvertering

Først må vi implementere BSON Konverter grensesnitt for type Lang, ettersom datoverdier er uttrykt i millisekunder siden epoken. Vi bruker DateTimeFormatter.ISO_INSTANT for å få forventet utdataformat:

offentlig klasse JsonDateTimeConverter implementerer Converter {private static final Logger LOGGER = LoggerFactory.getLogger (JsonDateTimeConverter.class); statisk sluttdato DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ISO_INSTANT .withZone (ZoneId.of ("UTC")); @ Overstyr offentlig ugyldig konvertering (lang verdi, StrictJsonWriter-forfatter) {prøv {Øyeblikkelig øyeblikkelig = ny dato (verdi). TilInstant (); Streng s = DATE_TIME_FORMATTER.format (øyeblikkelig); writer.writeString (s); } catch (Unntak e) {LOGGER.error (String.format ("Kunne ikke konvertere forskyvning% d til JSON-dato", verdi), e); }}}

Så kan vi passere en forekomst av denne klassen som en DateTime-omformer til JsonWriterSettings bygger:

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

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

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

6. Konklusjon

I denne artikkelen har vi sett standard oppførsel av BSON til JSON dokumentkonvertering.

Vi la vekt på hvordan tilpasse datoformatet, som er et vanlig problem, ved hjelp av BSON Konverter.

Selvfølgelig, vi kan fortsette på samme måte for å konvertere andre datatyper: for eksempel nummer, boolsk, nullverdi eller objekt-id.

Som alltid kan koden bli funnet på GitHub.

Java bunn

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

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