Java 如何使用正则表达式识别JSON字符串中的错误消息?
我正在从事一个项目,在该项目中,我正在使用运行restful服务的Java 如何使用正则表达式识别JSON字符串中的错误消息?,java,regex,json,multithreading,gson,Java,Regex,Json,Multithreading,Gson,我正在从事一个项目,在该项目中,我正在使用运行restful服务的RestTemplate调用我的一个服务器,并从它们那里获得响应 如果出现问题,我将从服务器得到的响应可以是这些错误响应中的任何一个(这就是我对错误响应的全部内容)—— {"warning": "user_id not found", "user_id": some_user_id} {"error": "user_id for wrong partition", "user_id": some_user_id, "partiti
RestTemplate
调用我的一个服务器,并从它们那里获得响应
如果出现问题,我将从服务器得到的响应可以是这些错误响应中的任何一个(这就是我对错误响应的全部内容)——
{"warning": "user_id not found", "user_id": some_user_id}
{"error": "user_id for wrong partition", "user_id": some_user_id, "partition": some_partition}
{"error": "missing client id", "client_id":2000}
或者低于成功响应(可以是任意随机的json字符串键,也可以是不同的)——
错误或警告将它们记录为错误,例如,找不到用户id或缺少客户端id
future.get调用Callable
任务-
public class TestingClient implements IClient {
private ExecutorService service = Executors.newFixedThreadPool(10);
private RestTemplate restTemplate = new RestTemplate();
@Override
public String executeSync(ClientKey keys) {
String response = null;
try {
ClientTask ClientTask = new ClientTask(keys, restTemplate);
Future<String> future = service.submit(ClientTask);
response = handle.get(keys.getTimeout(), TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
} catch (Exception e) {
}
return response;
}
}
正如您在我上面的代码中所看到的,如果我们得到任何错误响应,我们反序列化JSON字符串只是为了记录特定的错误消息。但是为了成功响应,我们不需要任何反序列化,但我们仍然在这样做
有没有更好的方法来解决这个问题?因为目前我发现GSON反序列化存在一些性能问题
识别成功响应和错误响应的唯一方法是在响应中使用error
或warning
,因此我考虑使用正则表达式,可以将错误或警告识别为响应字符串中的键。如果响应字符串中包含错误或警告,则提取特定错误或警告消息,并将其记录下来
我想可能有更好的方法来解决这个问题,而不必为反序列化付出代价。我认为仅仅依靠正则表达式是危险的。如果服务器稍微改变输出格式怎么办
我会尝试做一个快速测试,可能是用一个简单的regexp查找字符串“error”
,如果有可能是错误响应,则进行完整的反序列化以确定它是否真的是错误
当一个偶然的常规响应触发快速检查时,您只需为误报支付额外的费用。我将使用http代码来控制成功/失败的数据解析。+1;这是几天来我看到的最完整、写得最好的新问题。错误和成功的响应都使用http返回代码200?Y交付到目前为止,es HTTP返回码对于错误和成功响应都是200。为什么要使用正则表达式来查找固定字符串?如果我没有遗漏某些内容,一个简单的find
应该就可以了。我对正则表达式非常生疏,所以不确定该如何做。如果你能提供一个示例,也许可以帮助我更好地理解。谢谢Henry.We控制从我们的服务器发送的消息,因此我正在考虑使用REGEX进行尝试,看看我是否在性能方面有所提高。如果您能提供一个示例,那么它将非常有帮助。
public class TestingClient implements IClient {
private ExecutorService service = Executors.newFixedThreadPool(10);
private RestTemplate restTemplate = new RestTemplate();
@Override
public String executeSync(ClientKey keys) {
String response = null;
try {
ClientTask ClientTask = new ClientTask(keys, restTemplate);
Future<String> future = service.submit(ClientTask);
response = handle.get(keys.getTimeout(), TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
} catch (Exception e) {
}
return response;
}
}
class ClientTask implements Callable<String> {
private ClientKey cKeys;
private RestTemplate restTemplate;
public ClientTask(ClientKey cKeys, RestTemplate restTemplate) {
this.restTemplate = restTemplate;
this.cKeys = cKeys;
}
@Override
public String call() throws Exception {
// .. some code here
String url = "some_url";
String response = restTemplate.getForObject(url, String.class);
String test = checkJSONResponse(response);
return test;
}
private String checkJSONResponse(final String response) throws Exception {
// may be there are some better way of doing it for my scenario instead of using GSON
Gson gson = new Gson();
String str = null;
JsonObject jsonObject = gson.fromJson(response, JsonObject.class); // parse it, may be performance issues here/
if (jsonObject.has("error") || jsonObject.has("warning")) {
final String error = jsonObject.get("error") != null ? jsonObject.get("error").getAsString() : jsonObject
.get("warning").getAsString();
// log specific `error` here using log4j
str = response;
} else {
str = response;
}
return str;
}
}