MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

बीएसओएन टाइप ऑब्जेक्ट आईडी को जेएसओएन में कनवर्ट करना (मोंगोडब में भंडारण) -जावा

ऐसा करने के कम से कम दो संभावित तरीके हैं। संभवतः सबसे सही तरीका यह है कि जीएसओएन टाइपएडाप्टर का उपयोग यह कॉन्फ़िगर करने के लिए किया जाए कि ऑब्जेक्ट आईडी को JSON पर कैसे लिखा जाता है (और इससे पढ़ा जाता है)। आपको कुछ ऐसा बनाना होगा जो TypeAdapter . को लागू करे और इसे GsonBuilder . के साथ पंजीकृत करें , इस तरह GSON को पता चलता है कि ObjectIds को संभालने का एक विशेष तरीका है।

मैंने आपके उपयोग के मामले और उदाहरण वस्तु का उपयोग करके इस काम को साबित करने के लिए एक छोटा परीक्षण लिखा है (लेकिन revNo छोड़ा गया है संक्षिप्तता के लिए फ़ील्ड):

@Test
public void shouldWriteCorrectJSON() {
    // given
    TaskObject taskObject = new TaskObject();
    taskObject._id = new ObjectId("51eae100c2e6b6c222ec3431");

    Gson gson = new GsonBuilder().registerTypeAdapter(ObjectId.class, new ObjectIdTypeAdapter()).create();

    // when
    String gsonString = gson.toJson(taskObject);

    // then
    assertThat(gsonString, is("{\"_id\":{\"$oid\":\"51eae100c2e6b6c222ec3431\"}}"));
}

private class ObjectIdTypeAdapter extends TypeAdapter<ObjectId> {
    @Override
    public void write(final JsonWriter out, final ObjectId value) throws IOException {
        out.beginObject()
           .name("$oid")
           .value(value.toString())
           .endObject();
    }

    @Override
    public ObjectId read(final JsonReader in) throws IOException {
        in.beginObject();
        assert "$oid".equals(in.nextName());
        String objectId = in.nextString();
        in.endObject();
        return new ObjectId(objectId);
    }
}

ध्यान दें कि परीक्षण का दावा है कि JSON जिस तरह से आप चाहते हैं उसे दिखता है, और मुझे एक ObjectIdTypeAdapter बनाना था वह जानता है कि ObjectId का फ़ील्ड नाम "$oid" है और मान केवल ObjectID का स्ट्रिंग मान है, और सभी फ़ील्ड को अलग-अलग क्रमबद्ध नहीं करता है।

यह भी ध्यान दें कि यदि आप JSON को ऑब्जेक्ट लिखे जाने के तरीके को बदलते हैं, तो आपको इसके पढ़ने के तरीके को भी बदलना होगा। इसलिए मैंने read . भी लागू किया है यह जाँचने के लिए कि फ़ील्ड का नाम सही है (यदि यह सही नहीं है तो आपको साधारण जोर देने के बजाय शायद यहाँ एक अपवाद फेंकना चाहिए), और फिर मान पढ़ें और इस स्ट्रिंग मान से ObjectId बनाएँ।

वास्तविक जीवन में, आप शायद उन दोनों मामलों में भी शून्य मानों की जांच करना चाहते हैं।

क्योंकि मैं एक जिम्मेदार कोडर हूं, मैंने यह दिखाने के लिए एक परीक्षण भी लिखा था कि रीडिंग केस भी काम करता है:

@Test
public void shouldReadFromJSON() {
    // given
    Gson gson = new GsonBuilder().registerTypeAdapter(ObjectId.class, new ObjectIdTypeAdapter()).create();

    // when
    TaskObject actualTaskObject = gson.fromJson("{\"_id\":{\"$oid\":\"51eae100c2e6b6c222ec3431\"}}", TaskObject.class);

    // then
    TaskObject taskObject = new TaskObject();
    taskObject._id = new ObjectId("51eae100c2e6b6c222ec3431");
    assertThat(actualTaskObject._id, is(taskObject._id));
}

आगे पढ़ना:

  • टाइप एडेप्टर
  • GsonBuilder.registerTypeAdapter
  • JsonReader और JsonWriter



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. 3 स्तरों के साथ MongoDB नेस्टेड लुकअप

  2. मोंगोडब में एकल दस्तावेज़ का आकार कैसे प्राप्त करें?

  3. mongodb - निकटतम पूर्णांक मान वाला दस्तावेज़ ढूंढें

  4. MapReduce का उपयोग करके डुप्लिकेट रिकॉर्ड हटाना

  5. MongoDB डेटा निर्देशिका / डेटा / डीबी नहीं मिला