我知道使用异常进行流量控制是一种不好的做法。但我遇到了以下情况:我需要解析 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/