java - 使用gson将json解析为java对象的问题

标签 java gwt gson

我想使用 google-gson 将 json 数据解析为 java 对象.

这是我要解析的数据示例:

  {"isBean":{"userName":"test","password":"password112"}}

IsBean.java

public interface IsBean extends Serializable,IsSerializable{

    long getId();

}

用户.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;
    }
}

测试.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) 必须创建,但由于类型是接口(interface),它不能为该字段创建实例对象。

换句话说,由于JSON字段没有指定对象类型,GSON必须依赖字段定义的类型来为字段值创建实例,如果类型是接口(interface)则无法做到。

因此,如果对您有意义,请考虑更改该字段的类型。或者考虑创建 InstanceCreator IsBean(怀疑它在逻辑上是可能的)。

另请参阅:Deserializing an abstract class in Gson

希望这对您有所帮助。

关于java - 使用gson将json解析为java对象的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13873887/

相关文章:

java - 如何识别特定的 USB 端口

java - GWT 中条件属性的 GSS CSS 表达式?

JAVA - 解析巨大(超大)JSON 文件的最佳方法

java - 使用 gson 和 back 进行序列化不适用于泛型类型

java - 如何使用GSON将json对象数组解析为JAVA二维数组?

java - 去除重复内容 Java

java - 如何更改 AlertDialog 中的蓝线(全息主题)

java - 将 Java 数据输入到 SQL 数据库

java - gxt gwt 日期字段语言未正确显示

java - 我应该使用哪个 Eclipse 版本进行 Google GWT 和 Google App Engine 开发?