使用gson将json解析为java对象时出现问题
我想使用将json数据解析为java对象 下面是我要分析的数据示例:使用gson将json解析为java对象时出现问题,java,gwt,gson,Java,Gwt,Gson,我想使用将json数据解析为java对象 下面是我要分析的数据示例: {"isBean":{"userName":"test","password":"password112"}} IsBean.java public interface IsBean extends Serializable,IsSerializable{ long getId(); } public class User implements IsBean,IsSerializable,Serializa
{"isBean":{"userName":"test","password":"password112"}}
IsBean.java
public interface IsBean extends Serializable,IsSerializable{
long getId();
}
public class User implements IsBean,IsSerializable,Serializable {
String userName;
String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public long getId() {
return 0;
}
}
public class RequestObj implements IsBean, Serializable,IsSerializable{
IsBean isBean;
@Override
public long getId() {
return 0;
}
public IsBean getIsBean() {
return isBean;
}
public void setIsBean(IsBean isBean) {
this.isBean = isBean;
}
}
public class Test {
public static void main(String[] args) {
Gson gson = new Gson();
User user=new User();
user.setPassword("password112");
user.setUserName("test");
RequestObj requestObj=new RequestObj();
requestObj.setIsBean(user);
String jsonStr=gson.toJson(requestObj);
System.out.println("jsonStr--->"+jsonStr);
try{
RequestObj request=gson.fromJson(jsonStr, RequestObj.class);
}catch (Exception e) {
e.printStackTrace();
}
}
}
User.java
public interface IsBean extends Serializable,IsSerializable{
long getId();
}
public class User implements IsBean,IsSerializable,Serializable {
String userName;
String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public long getId() {
return 0;
}
}
public class RequestObj implements IsBean, Serializable,IsSerializable{
IsBean isBean;
@Override
public long getId() {
return 0;
}
public IsBean getIsBean() {
return isBean;
}
public void setIsBean(IsBean isBean) {
this.isBean = isBean;
}
}
public class Test {
public static void main(String[] args) {
Gson gson = new Gson();
User user=new User();
user.setPassword("password112");
user.setUserName("test");
RequestObj requestObj=new RequestObj();
requestObj.setIsBean(user);
String jsonStr=gson.toJson(requestObj);
System.out.println("jsonStr--->"+jsonStr);
try{
RequestObj request=gson.fromJson(jsonStr, RequestObj.class);
}catch (Exception e) {
e.printStackTrace();
}
}
}
RequestObj.java
public interface IsBean extends Serializable,IsSerializable{
long getId();
}
public class User implements IsBean,IsSerializable,Serializable {
String userName;
String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public long getId() {
return 0;
}
}
public class RequestObj implements IsBean, Serializable,IsSerializable{
IsBean isBean;
@Override
public long getId() {
return 0;
}
public IsBean getIsBean() {
return isBean;
}
public void setIsBean(IsBean isBean) {
this.isBean = isBean;
}
}
public class Test {
public static void main(String[] args) {
Gson gson = new Gson();
User user=new User();
user.setPassword("password112");
user.setUserName("test");
RequestObj requestObj=new RequestObj();
requestObj.setIsBean(user);
String jsonStr=gson.toJson(requestObj);
System.out.println("jsonStr--->"+jsonStr);
try{
RequestObj request=gson.fromJson(jsonStr, RequestObj.class);
}catch (Exception e) {
e.printStackTrace();
}
}
}
Test.java
public interface IsBean extends Serializable,IsSerializable{
long getId();
}
public class User implements IsBean,IsSerializable,Serializable {
String userName;
String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public long getId() {
return 0;
}
}
public class RequestObj implements IsBean, Serializable,IsSerializable{
IsBean isBean;
@Override
public long getId() {
return 0;
}
public IsBean getIsBean() {
return isBean;
}
public void setIsBean(IsBean isBean) {
this.isBean = isBean;
}
}
public class Test {
public static void main(String[] args) {
Gson gson = new Gson();
User user=new User();
user.setPassword("password112");
user.setUserName("test");
RequestObj requestObj=new RequestObj();
requestObj.setIsBean(user);
String jsonStr=gson.toJson(requestObj);
System.out.println("jsonStr--->"+jsonStr);
try{
RequestObj request=gson.fromJson(jsonStr, RequestObj.class);
}catch (Exception e) {
e.printStackTrace();
}
}
}
错误:
java.lang.RuntimeException: Unable to invoke no-args constructor for interface com.test.gson.shared.IsBean. 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)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172)
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 com.test.gson.server.Test.main(Test.java:18)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.google.gson.internal.UnsafeAllocator$1.newInstance(UnsafeAllocator.java:48)
at com.google.gson.internal.ConstructorConstructor$8.construct(ConstructorConstructor.java:164)
... 8 more
Caused by: java.lang.InstantiationException: com.test.gson.shared.IsBean
at sun.misc.Unsafe.allocateInstance(Native Method)
... 14 more
没有看到
CommunicationObject
的代码,我不能肯定,但我很有信心地猜测该类有一个类型为IsBean
的字段,您可以在其中使用它来保存用户。如果是这样,问题是GSON扫描类CommunicationObject
的对象obj
的字段,并根据字段定义,必须创建字段的值(类型为IsBean
),但由于该类型是一个接口,因此无法为该字段实例化对象
换句话说,由于JSON字段没有指定对象类型,因此GSON必须依赖字段的定义类型为字段值创建实例,如果类型是接口,则无法创建实例
<>所以,如果有意义的话,考虑改变那个字段的类型。或者研究如何创建IsBean
(确保这在逻辑上是可能的)
另见:
希望这有帮助。在Stackoverflow的帮助下,问题得以解决
创建gson对象:
Gson gson = new GsonBuilder().registerTypeAdapter(IsBean.class, new InterfaceAdapter<IsBean>()).create();
Gson Gson=new GsonBuilder().registerTypeAdapter(IsBean.class,new interfacedapter()).create();
正如我所怀疑的那样。不幸的是,接口(抽象类)字段将是创建其实例的默认方式。因此,您必须决定IsBean
的默认类型。