ऐसा करने के कम से कम दो संभावित तरीके हैं। संभवतः सबसे सही तरीका यह है कि जीएसओएन टाइपएडाप्टर का उपयोग यह कॉन्फ़िगर करने के लिए किया जाए कि ऑब्जेक्ट आईडी को 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