1. अवलोकन
इस पिछले लेख में, हमने देखा है कि MongoDB से जावा ऑब्जेक्ट के रूप में BSON दस्तावेज़ कैसे प्राप्त करें।
यह एक REST API विकसित करने का एक बहुत ही सामान्य तरीका है, क्योंकि हम इन वस्तुओं को JSON में परिवर्तित करने से पहले संशोधित करना चाह सकते हैं (उदाहरण के लिए जैक्सन का उपयोग करके)।
हालाँकि, हम अपने दस्तावेज़ों में कुछ भी बदलना नहीं चाह सकते हैं। जावा ऑब्जेक्ट मैपिंग को वर्बोज़ कोडिंग की परेशानी से बचाने के लिए, हम जेएसओएन दस्तावेज़ रूपांतरण के लिए सीधे बीएसओएन का उपयोग कर सकते हैं ।
आइए देखें कि इस उपयोग के मामले में MongoDB BSON API कैसे काम करता है।
2. Morphia के साथ MongoDB में BSON दस्तावेज़ निर्माण
सबसे पहले, आइए इस आलेख में वर्णित मॉर्फिया का उपयोग करके अपनी निर्भरताएं सेट करें।
यहां हमारा उदाहरण है इकाई जिसमें विभिन्न विशेषता प्रकार शामिल हैं:
@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 ...
}
तो चलिए हमारे परीक्षण के लिए एक नई बीएसओएन इकाई बनाते हैं और इसे मोंगोडीबी में सहेजते हैं:
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. डिफ़ॉल्ट BSON से JSON दस्तावेज़ रूपांतरण
आइए अब डिफ़ॉल्ट रूपांतरण का परीक्षण करें जो बहुत आसान है:बस toJson पर कॉल करें बीएसओएन दस्तावेज़ . से विधि कक्षा :
@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());
}
}
अपेक्षितJson मान है:
{
"_id": "isbn",
"className": "com.baeldung.morphia.domain.Book",
"publisher": {
"_id": {
"$oid": "fffffffffffffffffffffffa"
},
"name": "publisher"
},
"price": 3.95,
"publishDate": {
"$date": 1577898812000
}
}
ऐसा लगता है कि यह एक मानक JSON मैपिंग के अनुरूप है।
हालांकि, हम देख सकते हैं कि दिनांक को डिफ़ॉल्ट रूप से $date के साथ एक ऑब्जेक्ट के रूप में रूपांतरित किया गया था युग समय प्रारूप में क्षेत्र। आइए अब देखें कि हम इस तिथि प्रारूप को कैसे बदल सकते हैं।
4. JSON दिनांक रूपांतरण के लिए आराम से BSON
उदाहरण के लिए, यदि हम एक अधिक क्लासिक आईएसओ तिथि प्रतिनिधित्व चाहते हैं (जैसे कि जावास्क्रिप्ट क्लाइंट के लिए), तो हम आराम से पास कर सकते हैं JSON मोड से toJson विधि, JsonWriterSettings.builder . का उपयोग करके :
bson.toJson(JsonWriterSettings
.builder()
.outputMode(JsonMode.RELAXED)
.build());
परिणामस्वरूप, हम प्रकाशित दिनांक . देख सकते हैं फ़ील्ड का "आराम से" रूपांतरण:
{
...
"publishDate": {
"$date": "2020-01-01T17:13:32Z"
}
...
}
यह प्रारूप सही लगता है, लेकिन हमारे पास अभी भी $date . है फ़ील्ड - आइए देखें कि कस्टम कनवर्टर का उपयोग करके इससे कैसे छुटकारा पाया जाए।
5. कस्टम BSON से JSON दिनांक रूपांतरण
सबसे पहले, हमें बीएसओएन कनवर्टर . को लागू करना होगा इंटरफ़ेस लंबे . प्रकार के लिए , जैसा कि युग के समय से दिनांक मान मिलीसेकंड में व्यक्त किए जाते हैं। हम DateTimeFormatter.ISO_INSTANT . का उपयोग कर रहे हैं अपेक्षित आउटपुट स्वरूप प्राप्त करने के लिए:
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);
}
}
}
फिर, हम इस वर्ग का एक उदाहरण डेटटाइम कनवर्टर के रूप में JsonWriterSettings में पास कर सकते हैं निर्माता :
bson.toJson(JsonWriterSettings
.builder()
.dateTimeConverter(new JsonDateTimeConverter())
.build());
अंत में, हमें एक सादा JSON ISO दिनांक स्वरूप मिलता है :
{
...
"publishDate": "2020-01-01T17:13:32Z"
...
}