protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(request.getParameter("msg").toString());
String data = request.getParameter("msg").toString();
Gson gson = new Gson();
MessageBase msggg = gson.fromJson(data, MessageBase.class);
//System.out.println(msggg.Id + msggg.MessageText);
}
public abstract class MessageBase implements Serializable {
public int Id;
public String MessageText;
public Date ReceiveDate;
}
public class SyncSmsMessage extends MessageBase {
public String SenderNum;
}
代码一直有效,直到MessageBase msggg=gson.fromJson(data, MessageBase.class);
。我得到了这个例外:
java.lang.RuntimeException: Failed to invoke public com.example.syncapp.MessageBase() with no args
at com.google.gson.internal.ConstructorConstructor$2.construct(ConstructorConstructor.java:94)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:162)
at com.google.gson.Gson.fromJson(Gson.java:795)
at com.google.gson.Gson.fromJson(Gson.java:761)
at com.google.gson.Gson.fromJson(Gson.java:710)
at com.google.gson.Gson.fromJson(Gson.java:682)
at AndroidServlet.doPost(AndroidServlet.java:75)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
我需要做什么? 我把.jar放在lib文件夹中,我认为tomcat加载了.jar。
答案 0 :(得分:22)
在反序列化
Object
时,Gson需要创建类的[strong>默认实例 [...]用于序列化和反序列化的性能良好的类应该具有无参数构造函数
您的问题是GSON的 Instance Creator 需要在您要反序列化JSON响应的类中使用无参数构造函数,即MessageBase
。
否则,您需要编写自己的Instance Creator,例如this。
答案 1 :(得分:2)
我在使用改造时遇到相同的问题,并发现在使用抽象类时会发生这种情况,因此我创建了一个扩展抽象类的空类({{1} }):
MessageBase
现在使用public class BaseResponse extends MessageBase {
}
并具有BaseResponse
的所有字段
答案 2 :(得分:0)
只能实例化抽象类,不能实例化。抽象方法主体必须为空(无花括号)。 从公共MessageBase中删除“摘要”,您就可以开始了。
答案 3 :(得分:0)
确保!
1- 类 implements Serializable
2- 即使是子类也不要抽象
3- 应该是公开的