Existují minimálně dva možné způsoby, jak toho dosáhnout. Pravděpodobně nejsprávnějším způsobem je použít GSON TypeAdapter ke konfiguraci způsobu zápisu ObjectId do (a čtení z) JSON. Musíte vytvořit něco, co implementuje TypeAdapter
a zaregistrujte jej v GsonBuilder
, tímto způsobem GSON ví, že existuje speciální způsob zpracování ObjectId.
Napsal jsem malý test, abych dokázal, že to funguje, pomocí vašeho případu použití a příkladu objektu (ale vynechal jsem revNo
pole pro stručnost):
@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);
}
}
Všimněte si, že test potvrzuje, že JSON vypadá tak, jak chcete, a že jsem musel vytvořit ObjectIdTypeAdapter
který zná, že název pole ObjectId je "$oid" a hodnota je jednoduše řetězcová hodnota ObjectID a neseerifikuje všechna pole jednotlivě.
Všimněte si také, že pokud změníte způsob zápisu objektu do JSON, musíte také změnit způsob jeho čtení. Takže jsem také implementoval read
abyste zkontrolovali, zda je název pole správný (pravděpodobně byste zde měli hodit výjimku místo použití jednoduchého tvrzení, pokud není správné), a pak si přečtěte hodnotu a vytvořte ObjectId z této hodnoty String.
V reálném životě pravděpodobně budete chtít také zkontrolovat nulové hodnoty v obou těchto případech.
Protože jsem zodpovědný kodér, napsal jsem také test, abych ukázal, že pouzdro na čtení také funguje:
@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));
}
Další čtení:
- Typový adaptér
- GsonBuilder.registerTypeAdapter
- JsonReader a JsonWriter