我向服务器调用一个请求网络,服务器总是响应如下所示的格式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
当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的结果。但是要测试是否抛出了某些东西,您必须将一个函数传递给,该函数会自行调用。上面使用的方法创