Lesen Sie BSON (mongoDB) mit GSON und TypeAdapter @ in PO

Ich suche nach einer Möglichkeit, ein MongoDB-Dokument mit GSON in ein POJO einzulesen. Es funktioniert einwandfrei, bis Sie auf Dinge wie Date's und Longs stoßen.

Ich möchte einen benutzerdefinierten Adapter für Gson schreiben, der alle langen BSON-Codierungen konvertiert. LesenDiepost Ich habe meinen eigenen Adapter erstellt:

public class BsonLongTypeAdapter extends TypeAdapter<Long>
{
    @Override
    public void write(JsonWriter out, Long value) throws IOException
    {
        out.beginObject()
           .name("$numberLong")
           .value(value.toString())
           .endObject();
    }

    @Override
    public Long read(JsonReader in) throws IOException
    {
        in.beginObject();
        assert "$numberLong".equals(in.nextName());
        Long value = in.nextLong();
        in.endObject();
        return value;
    }
}

Ich habe die folgenden Tests definiert, um zu überprüfen, ob dies funktioniert:

@Test
public void canWriteCorrectJSON() {
    Gson gson = new GsonBuilder().registerTypeAdapter(Long.class, new BsonLongTypeAdapter()).create();
    MyTestObject obj = new MyTestObject(1458569479431L);
    String gsonString = gson.toJson(obj);
    assertEquals("{\"timestamp\":{\"$numberLong\":\"1458569479431\"}}",gsonString);
}

@Test
public void canReadFromJSON() {
    Gson gson = new GsonBuilder().registerTypeAdapter(Long.class, new BsonLongTypeAdapter()).create();
    MyTestObject actualTaskObject = gson.fromJson("{\"timestamp\":{\"$numberLong\":\"1458569479431\"}}", MyTestObject.class);
    MyTestObject taskObject = new MyTestObject(1458569479431L);
    assertEquals(taskObject.getTimestamp(),actualTaskObject.getTimestamp());
}

private static class MyTestObject
{
    long timestamp;

    public MyTestObject(long ts)
    {
        timestamp = ts;
    }
    public long getTimestamp()
    {
        return timestamp;
    }

    public void setTimestamp(long timestamp)
    {
        this.timestamp = timestamp;
    }
}

Der erste (Schreib-) Test funktioniert einwandfrei, aber der Lesetest schlägt fehl bei:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a long but was BEGIN_OBJECT at line 1 column 15 path $.timestamp

Weil die Lesefunktion von meinem Adapter niemals aufgerufen wird. Ich nehme an, dass dies daran liegt, dass ich MyTestObject und nicht Long zuordnen möchte, aber keine Adapter für alle Klassen schreiben muss, die Longs enthalten.

Ist es möglich, einen Adapter für GSON zu schreiben, der alle von mir gesendeten BSON-Longs in diesen konvertiert?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage