Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用正则表达式识别JSON字符串中的错误消息?_Java_Regex_Json_Multithreading_Gson - Fatal编程技术网

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

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

我正在从事一个项目,在该项目中,我正在使用运行restful服务的
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字符串键,也可以是不同的)——

  • 如果我得到上面提到的任何错误响应,那么我将对其进行反序列化(my bad:(),这样我就可以使用特定的
    错误
    警告
    将它们记录为错误,例如,
    找不到用户id
    缺少客户端id
  • 如果它是一个成功的响应,那么我也反序列化它,我的用例不需要它,因为我们没有任何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;
        }
    }
    
    正如您在我上面的代码中所看到的,如果我们得到任何错误响应,我们反序列化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;
        }
    }