GSONを使ってMongoDB文書をPOJOに読み込む方法を探しています。あなたがデートやロングのようなものに遭遇するまではうまく動作します。GSONとTypeAdapterを使ってBSON(mongoDB)をPOJOに読む
私はGson用のカスタムアダプタを書いています。このアダプタは、長いBSONコードを変換します。私はこれが動作するかどうか確認するには、次のテストを定義している
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;
}
}
:
@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;
}
}
最初の(書き込み)テストはうまく動作しますが、読み出しテストthisポストを読むと、私は自分のアダプタを作成しましたが失敗する:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a long but was BEGIN_OBJECT at line 1 column 15 path $.timestamp
私のアダプタからの読み取り機能が呼び出されないため。これは、私がMyTestObjectにマッピングしたいのであって、Longにはマッピングしたくないからだと推測しますが、longを含むすべてのクラスのアダプタを作成する必要はありません。
送信するすべてのBSONロングを変換するGSON用のアダプタを作成することはできますか?
、Mongoはあなたのアダプターを使用するのはなぜですか?BSONは使用できません。 – Dudi
それはあなた次第です。このコードはbson文字列(mongodb出力のような)をpojoとbackに変換するために使うことができます。 –
gsonオブジェクトに登録されたAFAIK TypeAdapterは、そのgsonを呼び出すときに使用されます。しかし、私がそれを引き出すときに私がモンゴの文書を持っていれば、それは自動的にそれをオブジェクトにしようとします。私はMongoCollectionを返すfind()を使用していますので、TypeAdapterを使用してTEEに自動デシリアライズします –
Dudi