MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Conversione di tipo BSON ObjectId in JSON (archiviazione in Mongodb) -Java

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