は、私は次のPOJOを持っている:GSONとInstanceCreator問題
public interface Shape {
public double calcArea();
public double calcPerimeter();
}
public class Rectangle implement Shape {
// Various properties of a rectangle
}
public class Circle implements Shape {
// Various properties of a circle
}
public class ShapeHolder {
private List<Shape> shapes;
// other stuff
}
私は何の問題GSONはJSONにShapeHolder
のインスタンスをシリアル化するために取得する必要がありません。しかし、私は戻ってShapeHolder
インスタンスにそのJSONの文字列を逆シリアル化しようとすると、私はエラーを取得:
String shapeHolderAsStr = getString();
ShapeHolder holder = gson.fromJson(shapeHodlderAsStr, ShapeHolder.class);
例外:
Exception in thread "main" java.lang.RuntimeException: Unable to invoke no-args constructor for interface
net.myapp.Shape. Register an InstanceCreator with Gson for this type may fix this problem.
at com.google.gson.internal.ConstructorConstructor$8.construct(ConstructorConstructor.java:167)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:162)
... rest of stack trace ommitted for brevity
をだから私はhereを見て、ShapeInstanceCreator
自分自身を実装開始しました:
public class ShapeInstanceCreator implements InstanceCreator<Shape> {
@Override
public Shape createInstance(Type type) {
// TODO: ???
return null;
}
}
しかし、今、私はこだわっている:私はCA私はjava.lang.reflect.Type
を与えられたんだけど、私は本当にjava.lang.Object
を必要としますn書き込みコード:
public class ShapeInstanceCreator implements InstanceCreator<Shape> {
@Override
public Shape createInstance(Type type) {
Object obj = convertTypeToObject(type);
if(obj instanceof Rectangle) {
Rectangle r = (Rectangle)obj;
return r;
} else {
Circle c = (Circle)obj;
return c;
}
return null;
}
}
どうすればよいですか?前もって感謝します!
UPDATE:@のraffianの提案(彼/彼女は掲載リンク)毎の
、私は正確にリンク内の1つの(私は何を変更していない)のようなInterfaceAdapter
を実施しました。今私は次の例外を得ています:
Exception in thread "main" com.google.gson.JsonParseException: no 'type' member found in what was expected to be an interface wrapper
at net.myapp.InterfaceAdapter.get(InterfaceAdapter.java:39)
at net.myapp.InterfaceAdapter.deserialize(InterfaceAdapter.java:23)
アイデアはありますか?
これを確認してください:http://stackoverflow.com/a/19600090/1360888、インターフェイスの代わりに基本クラスがありますが、それはあなたの問題のようです。 – giampaolo