Java - 解析 JSON 时忽略无效记录的更好方法

标签 java json exception collections

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

因此,在我当前的实现中,我使用带有 continue 的 try/catch block 。这里更正确的方法是什么?

这是我的实现方式:

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

最佳答案

实际上,您想使用 error 级别记录解析问题。 所以抛出异常是有道理的。
如果解析错误是一种异常情况,您应该保持自己的方式,但不要使用这里不方便的继续:

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 或 info level 中添加日志。

关于Java - 解析 JSON 时忽略无效记录的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53221681/

相关文章:

java - 检查字典中是否包含某个单词

php - 使用 Imgur API 和 PHP 获取图像数据

c# - 使用现有框架 ConstraintException 来处理数据约束违规

java - 如何保存JPA实体的副本?

java - 为什么这个 MapStruct 生成的类不包含 import 语句?

java - 是否可以打印静态方法?

jquery - 以设置的间隔遍历 JSON 提要项目并替换上一个项目

iphone - 如何从使用 JSONKit 创建的 NSDictionary 正确填充 UITableView NSArray?

c++ - 如果 throw 会发生什么;语句在 catch block 之外执行?

java - Spring XSD的访问报错