我正在开发一个项目,我正在对我的服务器进行rest url调用,这会给我一个JSON字符串作为响应。如果服务有任何问题,那么它会给我以下任何一个JSON字符串作为错误响应 -
{"error":"no user_id passed"}
or
{"warning": "user_id not found", "user_id": some_user_id}
or
{"error": "user_id for wrong partition", "user_id": some_user_id, "partition": some_partition}
or
{"error":"no client_id passed"}
or
{"error": "missing client id", "client_id":2000}
但是如果它是成功的响应,那么我将把json字符串作为 -
{"@data": {"oo":"1205000384","p":"2047935"}
以下是我正在拨打电话的代码,如果服务端出现问题或者成功,则response
变量将具有JSON字符串。
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(url, String.class);
// here response has the JSON string
ClientResponse clientResponse = checkJSONResponse(response);
return clientResponse;
目前我正在返回响应,因为它没有检查任何内容。但是现在我正在考虑验证响应并查看它是否是错误,然后使用特定错误记录它,如果是成功响应,则返回它。
第一个选项: - 我应该每次为每个调用反序列化上面的json response
字符串,然后查看它是否有成功或错误响应。
第二个选项: - 或者我应该只检查响应字符串是否以错误或警告开始,如果它是以错误或警告开始,则反序列化响应并提取特定的错误消息。
因为大部分时间我们都会得到数据的成功响应,只有2%左右我们会得到高于错误的响应,所以我想每次反序列化只是为了只提取错误情况将是昂贵的,相比之下startsWith
错误或警告选项,然后反序列化它?
第一个选项 -
private ClientResponse checkJSONResponse(final String response) throws Exception {
Gson gson = new Gson();
ClientResponse clientResponse = null;
JsonObject jsonObject = gson.fromJson(response, JsonObject.class); // parse
if (jsonObject.has("error") || jsonObject.has("warning")) {
final String error = jsonObject.get("error") != null ? jsonObject.get("error").getAsString() : jsonObject
.get("warning").getAsString();
// log error here
ClientResponse clientResponse = new ClientResponse(response, "ERROR_OCCURED", "SUCCESS");
} else {
ClientResponse clientResponse = new ClientResponse(response, "NONE", "SUCCESS");
}
return clientResponse;
}
第二个选项 -
private ClientResponse checkJSONResponse(final String response) throws Exception {
Gson gson = new Gson();
ClientResponse clientResponse = null;
if(response.startsWith("{\"error\":") || response.startsWith("{\"warning\":")) {
JsonObject jsonObject = gson.fromJson(response, JsonObject.class); // parse
if (jsonObject.has("error") || jsonObject.has("warning")) {
final String error = jsonObject.get("error") != null ? jsonObject.get("error").getAsString() : jsonObject
.get("warning").getAsString();
// log error here with specific messages
ClientResponse clientResponse = new ClientResponse(response, "ERROR_OCCURED", "SUCCESS");
}
} else {
ClientResponse clientResponse = new ClientResponse(response, "NONE", "SUCCESS");
}
return clientResponse;
}
这个用例的最佳选择是什么?我主要关注性能观点哪个选项更有效?
答案 0 :(得分:1)
第一个显然更好。你所做的是premature optimization。你的第二个案例非常容易出错,想象一下如果重新排序元素会发生什么。在你确定这是瓶颈之前不要做优化。
UPD:如果您已经对代码进行了分析,并发现无用的对象解析确实存在问题。您可以分配错误代码,而不是传递字符串值并使用lastIndexOf()
方法而不是startsWith()
。这样可以防止对象重新排序问题,但会保证警告消息中不存在“错误”字样。