Java-一种解析JSON

时间:2018-11-09 07:49:40

标签: java json exception collections

我知道将异常用于流控制是一种不良做法。但是我遇到了以下情况:我需要解析JSON文件,并且如果记录键的值损坏,我只想记录它并继续解析jsonArray中的另一个对象。即使该值为null,我也要忽略它并继续。

因此,在当前的实现中,我将try / catch块与continue一起使用。什么是更正确的方法呢?

这是我的实现方式:

public static void parseMetrics(JSONParser parser, File jsonFile,
                             String metricKey, List<String> metricsList) throws IOException, ParseException {

        JSONArray jsonArray = (JSONArray) parser.parse(new InputStreamReader(new FileInputStream(jsonFile)));
        for (Object obj : jsonArray) {
            try {
                JSONObject jsonObject = (JSONObject) obj;
                String metricValue = (String) jsonObject.get(metricKey);
                Long metricDate = parseDate(jsonObject);
                metricsList.add(new Metric(metricValue, metricDate));
            } catch (java.text.ParseException e) {
                continue;
                log.error("Error when parsing JSON", e);
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

实际上,您想以error级别登录解析问题。 所以抛出异常是有道理的。
如果解析错误是异常情况,则应继续使用,但不要使用continue,在此不方便:

for (Object obj : jsonArray) {
    try {
        JSONObject jsonObject = (JSONObject) obj;
        String metricValue = (String) jsonObject.get(metricKey);
        Long metricDate = parseDate(jsonObject);
        metricsList.add(new Metric(metricValue, metricDate));
    } catch (java.text.ParseException e) {         
        log.error("Error when parsing JSON", e);
    }
}

但是,如果您认为解析问题不是要记录的问题,而是可能发生 的正常情况,则实际上,您不必传播parseDate()中的异常,但是您可以可能会返回类似OptionalLong的内容,而不是Long
它将从客户端提供:

for (Object obj : jsonArray) {
    JSONObject jsonObject = (JSONObject) obj;
    String metricValue = (String) jsonObject.get(metricKey);
    OptionalLong metricDate = parseDate(jsonObject);
    metricDate.ifPresent(d -> metricsList.add(new Metric(metricValue, d));           
}

如果有必要,您也可以在debug或信息level中添加日志。