问题描述
我想使用 google-gson 将 json 数据解析为 java 对象.
I want to parse json data into java object using google-gson.
这是我要解析的数据的示例:
Here is an example of the data I want to parse:
{"isBean":{"userName":"test","password":"password112"}}
IsBean.java
public interface IsBean extends Serializable,IsSerializable{
long getId();
}
User.java
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;
}
}
RequestObj.java
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;
}
}
Test.java
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
类型,您可以在其中使用它来保存 User
.如果是这样,问题是 GSON 会扫描 CommunicationObject
类的对象 obj
的字段,并根据字段定义,字段的值(类型为 IsBean
) 将必须被创建,但由于类型是一个接口,它不能为该字段创建实例对象.
Without seeing the code of CommunicationObject
, I can't say for sure BUT I am guessing with confidence that the class has a field of type IsBean
in which you use it to hold the User
. If so, the problem is that GSON scans fields of the object obj
of the class CommunicationObject
and based on the field definition, the value of the field (which is typed IsBean
) will have to be created BUT since the type is an interface, it can't instance object for that field.
换句话说,由于 JSON 字段没有指定对象类型,GSON 必须依赖于定义的字段类型来为字段值创建实例,如果类型是接口,则无法实现.
Another words, as JSON field does not specifies the object type, GSON must relies on the defined type of the field to create the instance for the field value which can't be done if the type is an interface.
因此,如果您觉得有意义,请考虑更改该字段的类型.或者考虑创建 InstanceCreator
(怀疑它在逻辑上是可能的).IsBean
的
So, consider changing the type of that field if that make sense to you. OR look into creating InstanceCreator
of IsBean
(doute that it is logically possible).
希望这会有所帮助.
这篇关于使用 gson 将 json 解析为 java 对象的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!