createinstance.java,java – GSON和InstanceCreator问题

我有以下POJO:

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 shapes;

// other stuff

}

我没有问题让GSON将ShapeHolder的一个实例序列化为JSON.但是,当我尝试将该JSON的String反序列化为ShapeHolder实例时,我收到错误:

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 {

@Override

public Shape createInstance(Type type) {

// TODO: ???

return null;

}

}

但现在我卡住了:我只给了一个java.lang.reflect.Type,但我真的需要一个java.lang.Object所以我可以编写如下代码:

public class ShapeInstanceCreator implements InstanceCreator {

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

}

}

我能做什么?

更新

根据@ raffian的建议(他/她发布的链接),我实现了一个完全类似链接中的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)

有任何想法吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值