sql >> Databáze >  >> NoSQL >> MongoDB

Převod ObjectId typu BSON na JSON (ukládání v Mongodb) -Java

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



  1. Zakázat redis při mnoha vypršení časového limitu pomocí pružinového spouštění

  2. Vytváření REST API pomocí EVE

  3. Spuštění více instancí Redis na Centos

  4. redis-server v ubuntu14.04:Vázaná adresa se již používá