Penukaran Dokumen BSON ke JSON di Java

Java Teratas

Saya baru sahaja mengumumkan kursus Learn Spring yang baru , yang berfokus pada asas-asas Spring 5 dan Spring Boot 2:

>> SEMAK KURSUS

1. Gambaran keseluruhan

Dalam artikel sebelumnya, kita telah melihat cara mendapatkan dokumen BSON sebagai objek Java dari MongoDB.

Ini adalah cara yang sangat biasa untuk mengembangkan REST API, kerana kita mungkin ingin mengubah objek ini sebelum menukarnya menjadi JSON (misalnya menggunakan Jackson).

Namun, kami mungkin tidak mahu mengubah apa-apa pada dokumen kami. Untuk menyelamatkan kita dari masalah pengkodean pemetaan objek Java verbose, kita dapat menggunakan penukaran dokumen BSON ke JSON langsung .

Mari lihat bagaimana API BSON MongoDB berfungsi untuk kes penggunaan ini.

2. Pembuatan Dokumen BSON di MongoDB dengan Morphia

Pertama sekali, mari kita atur kebergantungan kita menggunakan Morphia seperti yang dijelaskan dalam artikel ini.

Inilah contoh kamientiti yang merangkumi pelbagai jenis atribut:

@Entity("Books") public class Book { @Id private String isbn; @Embedded private Publisher publisher; @Property("price") private double cost; @Property private LocalDateTime publishDate; // Getters and setters ... }

Kemudian mari buat entiti BSON baru untuk ujian kami dan simpan ke MongoDB:

public class BsonToJsonIntegrationTest { private static final String DB_NAME = "library"; private static Datastore datastore; @BeforeClass public static void setUp() { Morphia morphia = new Morphia(); morphia.mapPackage("com.baeldung.morphia"); datastore = morphia.createDatastore(new 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. Penukaran Dokumen BSON ke JSON lalai

Sekarang mari kita uji penukaran lalai yang sangat mudah: hanya memanggil kaedah toJson dari kelas Dokumen BSON :

@Test public void givenBsonDocument_whenUsingStandardJsonTransformation_thenJsonDateIsObjectEpochTime() { String json = null; try (MongoClient mongoClient = new MongoClient()) { MongoDatabase mongoDatabase = mongoClient.getDatabase(DB_NAME); Document bson = mongoDatabase.getCollection("Books").find().first(); assertEquals(expectedJson, bson.toJson()); } }

The expectedJson nilai ialah:

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

Ini nampaknya sesuai dengan pemetaan JSON standard.

Namun, kita dapat melihat bahawa tarikh itu ditukar secara lalai sebagai objek dengan medan $ date dalam format waktu zaman. Mari lihat sekarang bagaimana kita boleh mengubah format tarikh ini.

4. Penukaran Tarikh BSON ke JSON Santai

Sebagai contoh, jika kita menginginkan perwakilan tarikh ISO yang lebih klasik (seperti untuk pelanggan JavaScript), kita dapat meneruskan mod JSON santai ke kaedah toJson , menggunakan JsonWriterSettings.builder :

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

Hasilnya, kita dapat melihat penukaran medan penerbitan "santai":

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

Format ini nampak betul, tetapi kita masih mempunyai medan $ date - mari kita lihat bagaimana menyingkirkannya menggunakan penukar tersuai.

5. Penukaran Tarikh BSON ke JSON tersuai

Pertama, kita harus melaksanakan antara muka BSON Converter untuk jenis Long , kerana nilai tarikh dinyatakan dalam milisaat sejak zaman. Kami menggunakan DateTimeFormatter.ISO_INSTANT untuk mendapatkan format output yang diharapkan:

public class JsonDateTimeConverter implements 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(); String s = DATE_TIME_FORMATTER.format(instant); writer.writeString(s); } catch (Exception e) { LOGGER.error(String.format("Fail to convert offset %d to JSON date", value), e); } } }

Kemudian, kita boleh lulus contoh kelas ini sebagai DateTime converter kepada JsonWriterSettings pembina :

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

Akhirnya, kami mendapat format tarikh JSON ISO biasa :

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

6. Kesimpulannya

Dalam artikel ini, kami telah melihat tingkah laku lalai penukaran dokumen BSON ke JSON.

Kami menyoroti cara menyesuaikan format tarikh, yang merupakan masalah umum, menggunakan BSON Converter .

Sudah tentu, kita boleh meneruskan cara yang sama untuk menukar jenis data lain : contohnya nombor, boolean, null value, atau id objek.

Seperti biasa, kodnya boleh didapati di GitHub.

Bahagian bawah Java

Saya baru sahaja mengumumkan kursus Learn Spring yang baru , yang berfokus pada asas-asas Spring 5 dan Spring Boot 2:

>> SEMAK KURSUS