これを行うには、少なくとも2つの方法があります。おそらく最も正しい方法は、GSON TypeAdapterを使用して、ObjectIdがJSONに書き込まれる(およびJSONから読み取られる)方法を構成することです。 TypeAdapter
を実装するものを作成する必要があります GsonBuilder
に登録します 、このようにして、GSONはObjectIdを処理する特別な方法があることを認識します。
ユースケースとサンプルオブジェクトを使用して、これが機能することを証明する小さなテストを作成しました(ただし、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を作成します。
実生活では、どちらの場合もnull値をチェックすることをお勧めします。
私は責任あるコーダーなので、リーディングケースも機能することを示すテストを作成しました:
@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));
}
さらに読む:
- TypeAdapter
- GsonBuilder.registerTypeAdapter
- JsonReaderおよびJsonWriter