sql >> Databasteknik >  >> NoSQL >> MongoDB

Konvertera BSON Type ObjectId till JSON (lagring i Mongodb) -Java

Det finns åtminstone två möjliga sätt att göra detta. Det mest korrekta sättet är förmodligen att använda GSON TypeAdapter för att konfigurera hur ObjectId skrivs till (och läses från) JSON. Du måste skapa något som implementerar TypeAdapter och registrera den med GsonBuilder , på detta sätt vet GSON att det finns ett speciellt sätt att hantera ObjectIds.

Jag har skrivit ett litet test för att bevisa att detta fungerar, med ditt användningsfall och exempelobjekt (men utelämnade revNo fält för korthet):

@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);
    }
}

Observera att testet hävdar att JSON ser ut som du vill ha den, och att jag var tvungen att skapa en ObjectIdTypeAdapter som vet att fältnamnet för ObjectId är "$oid" och värdet är helt enkelt strängvärdet för ObjectID, och serialiserar inte alla fält individuellt.

Observera också att om du ändrar hur objektet skrivs till JSON, måste du också ändra hur det läses. Så jag har också implementerat read för att kontrollera att fältnamnet är det korrekta (du bör förmodligen slänga ett undantag här istället för att använda en enkel påstående om det inte är korrekt), och sedan läsa värdet och skapa ObjectId från detta String-värde.

I verkligheten vill du förmodligen också kontrollera nollvärden i båda dessa fall.

Eftersom jag är en ansvarig kodare skrev jag också ett test för att visa att läsfallet fungerar också:

@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));
}

Mer läsning:

  • Typadapter
  • GsonBuilder.registerTypeAdapter
  • JsonReader och JsonWriter



  1. Ansluta Hydra-CLI till en lösenordsskyddad redis-server?

  2. Översätt FilterDefinition<TDocument> till vanlig json mongo-fråga som jag kan köra i ett mongo-skal

  3. 10 tips för att förbättra din MongoDB-säkerhet

  4. Hur man tillämpar uppdatering med filtrerad positionsoperator med arrayFilters