当前位置: 首页 > 知识库问答 >
问题:

Gson不能投掷对象

卢作人
2023-03-14

我向服务器调用一个请求网络,服务器总是响应如下所示的格式json:

{

   "error": 200,
   "message": "Login Success",
   "message_app": "abcxyz",
   "data": {
     "client_id": "1423423",
     "client_secret": "64646456546"
   }
 } 

对于每种请求,只有jsonObject数据包含不同的字段。新响应的示例:

{

   "error": 200,
   "message": "Get product success",
   "message_app": "vcxvxcv",
   "data": {
     "product_title": "Product A",
     "product_desc": "This is a description for product A"
   }
 } 

因此,我决定让一个通用类调用ServerResult包含一个字段“Object”,以便将其强制转换为特定对象。

//ServerResult.class

public class ServerResult {
    private int error;
    private String message;
    private String message_app;
    private Object data;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getMessageApp() {
        return message_app;
    }

    public void setMessageApp(String messageApp) {
        this.message_app = messageApp;
    }

    public int getError() {
        return error;
    }

    public void setError(int error) {
        this.error = error;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public String getMessage_app() {
        return message_app;
    }

    public void setMessage_app(String message_app) {
        this.message_app = message_app;
    }
}

//client.java

public class Client {

    private String client_id;
    private String client_secret;

    public String getClientId() {
        return client_id;
    }

    public void setClientId(String client_id) {
        this.client_id = client_id;
    }

    public String getClientSecret() {
        return client_secret;
    }

    public void setClientSecret(String client_secret) {
        this.client_secret = client_secret;
    }
}

请求完成后,我通过GSON将json转换为ServerResult对象:

@Override    
  public void onResponse(String response) {              
     Gson gson = new Gson();
     ServerResult serverResult = gson.fromJson(response, ServerResult.class); //convert json String to ServerResult object

  }

然后将数据对象强制转换为客户端对象

Client client = (Client)serverResult.getData(); // problem here

来自GSON的日志错误:

java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap不能强制转换为MyPackageName.Client

共有1个答案

扶隐水
2023-03-14

GSON解析JSON数据时。GSON不可能知道您的数据字段包含客户端数据产品数据,因为您没有指定任何特定的对象。因此GSON将把该数据字段转换为map对象。

你可以试试下面的方法。

如下所示更改ServerResult

public class ServerResult {
    private int error;
    private String message;
    private String message_app;
    private Map<String, String> data;
}

现在创建util方法从map获取client数据。

public static Client getClient(Map<String, String> data){
    Client client = new Client();
    client.setClientId(data.get("client_id"));
    client.setClientSecret(data.get("client_secret"));
    return client;
}

现在用它就像..

@Override    
public void onResponse(String response) {              
    Gson gson = new Gson();
    ServerResult serverResult = gson.fromJson(response, ServerResult.class); //convert json String to ServerResult object
    Client client = getClient(serverResult.getData());
}

类似地,您还可以从同一个ServerResult对象获取产品数据。不创建不同的解析器类。

 类似资料:
  • 有人可以解释我什么时候使用关键字 throw new 有用.而不是在方法的签名旁边使用抛出? 我知道当方法抛出Checked Exception时。Java迫使我们通过将Exception处理到try-catch块中,或者通过在签名旁边的关键字throws指定将在其他地方完成,从而直接在方法中处理它。 然而,我很难理解何时使用关键字throw new是有用的,以及为什么。它与处理未选中的异常有关吗

  • 我正在用python运行下面的代码 我每次都会遇到下面的错误-有人能帮忙吗! OpenCV错误:未指定的错误(该函数未实现。使用Windows、GTK 2.x或Carbon支持重建库。如果您在Ubuntu或Debian上,请安装libgtk2.0-dev和pkg config,然后重新运行cmake或configure脚本),位于cvShowImage、file/Users/travis/buil

  • 我有两个类(SimManager和Sim),我想为它们创建模拟对象,然后使用存根方法。 测试在上面第9行抛出这两个错误跟踪。 第一: Java语言lang.VerifyError:org/mockito/cglib/core/reflectils at org。莫基托。cglib。果心KeyFactory$发电机。在org上生成Class(KeyFactory.java:167)。莫基托。cgli

  • 我在视图中有一个ImageView,并尝试用它显示一个WritableImage实例。我正在外线程中绘制它,并通过侦听ObjectProperty的更改事件将其传递给视图。 imageView应该准备好接收图像,它由我的主视图显示。但是这是一个不合法的例外 线程“Thread-4”Java . lang . illegalstateexception中的异常:不在FX应用程序线程上;当前线程=线程

  • 我有下面的代码,它按照预期工作: 我想知道是否有一种方法,只有一个orElseThrow-Part,或做它更少的冗余?

  • 问题内容: 我在让Chai的node.js应用程序进行测试时遇到问题。测试会不断导致抛出的错误,但是如果我将测试用例包装在try和catch中并断言所捕获的错误,它将起作用。 难道不喜欢的工作,我认为它应该还是什么? 失败: 问题答案: 您必须将一个函数传递给。像这样: 执行此操作的方式将传递给call的结果。但是要测试是否抛出了某些东西,您必须将一个函数传递给,该函数会自行调用。上面使用的方法创