java - 如何使用正则表达式来识别JSON字符串中的错误消息?

标签 java regex json multithreading gson

我正在开发一个项目,在该项目中,我使用 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 字符串, key 也可以不同)-

{"@data": {"oo":"1205000384","p":"2047935"} 
  1. 如果我收到上述任何错误响应,那么我将对其进行反序列化(我的错误 :( ),以便我可以将它们记录为带有特定 errorwarning 的错误 我得到了服务器,例如 - user_id not foundmissing client id
  2. 如果这是一个成功的响应,那么我也会反序列化它,我的用例不需要它,因为我们没有任何 POJO,我只需要返回响应,因为它是我从服务器。

在我的用例中,如果这是一个成功的响应,我不需要反序列化我的响应字符串,因为我们没有任何 POJO,并且我们将返回响应字符串,因为它是我们从服务器。但只是为了记录特定的错误消息(如果我从服务器收到错误响应),我将其反序列化,我认为这是不必要的。对于我的用例可能有更好的解决方案。

下面是我的 Java 客户端,它使用 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;
    }
}

现在下面是我的 ClientTask 类,它实现了 Callable 接口(interface)。在调用方法中,我生成一个 URL,然后使用 RestTemplate 访问服务器并获取响应 -

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;
    }
}

正如您在上面的代码中看到的,我们反序列化 JSON 字符串只是为了在收到任何错误响应时记录特定的错误消息。但为了成功响应,我们不需要任何反序列化,但我们仍然在这样做。

有没有更好的方法来解决这个问题?因为目前我发现 GSON 反序列化存在一些性能问题。

我可以识别成功响应和错误响应的唯一方法是在响应中使用错误警告,因此我正在考虑使用可以识别错误或错误的正则表达式warning 作为响应字符串中的键。如果响应字符串中包含错误或警告,则提取特定的错误或警告消息并记录它。

我想可能有一些更好的方法可以解决这个问题,而无需支付反序列化的成本。

最佳答案

我认为仅仅依赖正则表达式是危险的。如果服务器稍微改变输出格式怎么办?

我会尝试进行快速测试,可能使用一个简单的正则表达式来查找字符串 "error"如果有可能它是一个错误响应,请执行完整的反序列化以确定它是否确实是一个错误。

只有当定期响应偶然触发快速检查时,您才需要为误报支付额外费用。

关于java - 如何使用正则表达式来识别JSON字符串中的错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21366491/

相关文章:

json - 我如何访问angular2中嵌套的json数据

json - 如何通过Powershell AD计算机所有者属性(如电子邮件和帐户名)获取?

c# 正则表达式捕获重复的关键字值

regex - 如何使用 pcregrep 排除多个目录?

javascript - JavaScript 可以连接 MySQL 吗?

java zipentry getsize 返回 -1

java - 基于 ADF 的应用程序与 Tomcat : cannot login in IE

Java ExecutorService 运行线程两次

java - 移动文件会导致文件名中路径分隔符为 "/"的文件

r - 使用 grep 查找带有反斜杠的字符串 - 字符转义