MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Chuyển đổi tài liệu BSON sang JSON trong Java

1. Tổng quan

Trong bài viết trước, chúng ta đã biết cách truy xuất tài liệu BSON dưới dạng đối tượng Java từ MongoDB.

Đây là một cách rất phổ biến để phát triển API REST, vì chúng tôi có thể muốn sửa đổi các đối tượng này trước khi chuyển đổi chúng thành JSON (sử dụng Jackson chẳng hạn).

Tuy nhiên, chúng tôi có thể không muốn thay đổi bất kỳ điều gì đối với tài liệu của mình. Để giúp chúng tôi không gặp rắc rối khi lập bản đồ các đối tượng Java dài dòng, chúng tôi có thể sử dụng chuyển đổi trực tiếp tài liệu BSON sang JSON .

Hãy xem cách API MongoDB BSON hoạt động cho trường hợp sử dụng này.

2. Tạo tài liệu BSON trong MongoDB với Morphia

Trước hết, hãy thiết lập các phụ thuộc của chúng tôi bằng cách sử dụng Morphia như được mô tả trong bài viết này.

Đây là ví dụ của chúng tôi thực thể bao gồm các loại thuộc tính khác nhau:

@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 ...
}

Sau đó, hãy tạo một thực thể BSON mới cho thử nghiệm của chúng tôi và lưu nó vào 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. Chuyển đổi tài liệu BSON sang JSON mặc định

Bây giờ, hãy kiểm tra chuyển đổi mặc định rất đơn giản:chỉ cần gọi toJson phương pháp từ BSON Tài liệu lớp :

@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 mong đợiJson giá trị là:

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

Điều này dường như tương ứng với ánh xạ JSON tiêu chuẩn.

Tuy nhiên, chúng ta có thể thấy rằng ngày được chuyển đổi theo mặc định thành một đối tượng có $ date trường ở định dạng thời gian kỷ nguyên. Bây giờ hãy xem cách chúng tôi có thể thay đổi định dạng ngày này.

4. Chuyển đổi ngày từ BSON sang JSON thoải mái

Ví dụ:nếu chúng tôi muốn trình bày ngày ISO cổ điển hơn (chẳng hạn như đối với ứng dụng khách JavaScript), chúng tôi có thể vượt qua relax Chế độ JSON cho toJson bằng cách sử dụng JsonWriterSettings.builder :

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

Do đó, chúng ta có thể thấy Ngày xuất bản chuyển đổi "thoải mái" của trường:

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

Định dạng này có vẻ đúng, nhưng chúng tôi vẫn có $ date trường - hãy xem cách loại bỏ nó bằng cách sử dụng công cụ chuyển đổi tùy chỉnh.

5. Chuyển đổi ngày từ BSON sang JSON tùy chỉnh

Trước tiên, chúng tôi phải triển khai BSON Converter giao diện cho loại Dài , vì giá trị ngày được biểu thị bằng mili giây kể từ thời gian kỷ nguyên. Chúng tôi đang sử dụng DateTimeFormatter.ISO_INSTANT để có được định dạng đầu ra mong đợi:

public class JsonDateTimeConverter implements Converter<Long> {

    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);
        }
    }
}

Sau đó, chúng ta có thể chuyển một phiên bản của lớp này dưới dạng trình chuyển đổi DateTime sang JsonWriterSettings người xây dựng :

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

Cuối cùng, chúng tôi nhận được định dạng ngày ISO JSON đơn giản :

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

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào chúng ta có thể tạo trường được tạo Tự động cho mongodb bằng cách sử dụng khởi động mùa xuân

  2. MongoDB:Thời gian chờ xảy ra sau 30000 mili giây chọn máy chủ bằng CompositeServerSelector

  3. Làm thế nào để kết nối với mongodb bằng sailsjs v0.10?

  4. Cập nhật hàng loạt và MongoDB dữ liệu mùa xuân

  5. Handlebars:Quyền truy cập đã bị từ chối để giải quyết thuộc tính từ vì nó không phải là tài sản riêng của cha mẹ của nó