0

我有一个 JSON 文件,其中有一些问题。解析 json 文件时,我会得到 ParserException。从解析器异常中,我提取了问题所在的位置。

现在我想要文件中那个特定位置的行号。

JSONObject json;
try {
    if (!file.exists()) {
        throw new ExceptionDoesNotExist(file);
    }
    scanner = new Scanner(file, Charset.defaultCharset().toString());
    String data = scanner.useDelimiter("\\Z").next();
    json = (JSONObject) new JSONParser().parse(data);
    return json;
} catch (ParseException e) {
    this.log.logException(e);
    int position = e.getPosition();
    String reason = e.getUnexpectedObject().toString();
    return new JSONObject();
}
4

1 回答 1

0
if (!file.exists()) {
    throw new ExceptionDoesNotExist(file);
}
scanner = new Scanner(file, Charset.defaultCharset().toString());
String data = scanner.useDelimiter("\\Z").next();
try {
    return new JSONParser().parse(data);
} catch (ParseException e) {
    String lineAndColumn = lineAndColumn(data, e, 4);
    ...;
    return new JSONObject();
}

public static String lineAndColumn(String text, ParseException e, int tabSize) {
    int position = e.getPosition();
    int lineNo = 1 + (int) text.substring(0, position).codePoints()
            .filter(cp -> cp == '\n')
            .count();
    int columnNo = 1 + text.substring(0, position).lastIndexOf('\n') + 1; // no \n okay too.

    // Tabs
    int cI = 0;
    for (int i = 0; i < columnNo - 1; ++i) {
        if (text.charAt(posion - (columnNo - 1) + i) == '\t') {
            cI += tabSize;
            cI %= tabSize;
        } else {
            ++cI;
        }
    }
    columnNo = cI + 1;

    return String.format("%d:%d"), lineNo, ColumnNo);
}
于 2019-11-01T11:00:26.070 回答