Ci sono almeno due modi possibili per farlo. Probabilmente il modo più corretto è utilizzare GSON TypeAdapter per configurare il modo in cui ObjectId viene scritto (e letto da) JSON. Devi creare qualcosa che implementi TypeAdapter
e registralo con GsonBuilder
, in questo modo GSON sa che esiste un modo speciale per gestire gli ObjectId.
Ho scritto un piccolo test per dimostrare che funziona, usando il tuo caso d'uso e l'oggetto di esempio (ma ho omesso il revNo
campo per brevità):
@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);
}
}
Nota che il test afferma che JSON ha l'aspetto che desideri e che ho dovuto creare un ObjectIdTypeAdapter
che sa che il nome del campo di ObjectId è "$oid" e il valore è semplicemente il valore stringa di ObjectID e non serializza tutti i campi singolarmente.
Nota anche che se modifichi il modo in cui l'oggetto viene scritto in JSON, devi anche cambiare il modo in cui viene letto. Quindi ho anche implementato read
per verificare che il nome del campo sia quello corretto (probabilmente dovresti lanciare un'eccezione qui invece di usare una semplice asserzione se non è corretta), quindi leggere il valore e creare ObjectId da questo valore String.
Nella vita reale, probabilmente vorrai anche verificare la presenza di valori nulli in entrambi i casi.
Poiché sono un programmatore responsabile, ho anche scritto un test per mostrare che anche il caso di lettura funziona:
@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));
}
Ulteriori letture:
- Adattatore tipo
- GsonBuilder.registerTypeAdapter
- JsonReader e JsonWriter