常见原因及解决方案

1. 数据为空或非 JSON 格式
  • 原因:输入数据可能为空字符串、null 或其他非 JSON 格式内容。
  • 解决方案:在解析前检查数据是否有效。
if (jsonStr != null && !jsonStr.trim().isEmpty()) {
    // 检查是否以 JSON 对象或数组的符号开头
    if (jsonStr.trim().startsWith("{") || jsonStr.trim().startsWith("[")) {
        JSONObject obj = JSON.parseObject(jsonStr);
    } else {
        throw new IllegalArgumentException("Not a valid JSON string: " + jsonStr);
    }
}
2. 编码问题
  • 原因:数据编码与代码读取时的编码不一致(如 UTF-8 与 GBK 冲突)。
  • 解决方案:确保数据以正确的编码读取。
// 从文件读取时指定编码
String jsonStr = new String(Files.readAllBytes(Paths.get("data.json")), StandardCharsets.UTF_8);
3. 非法字符或 BOM 头
  • 原因:JSON 字符串开头包含不可见字符(如 UTF-8 BOM 头 EF BB BF)。
  • 解决方案:清理字符串开头的非法字符。
// 移除 UTF-8 BOM 头
if (jsonStr.startsWith("\uFEFF")) {
    jsonStr = jsonStr.substring(1);
}
// 移除其他非法开头字符
jsonStr = jsonStr.trim();
4. FastJSON 版本兼容性
  • 原因:某些版本的 FastJSON 存在解析漏洞或缺陷。
  • 解决方案:升级到最新版本(当前最新为 2.x 系列)。
<!-- Maven 依赖 -->
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.24</version>
</dependency>
  • 并改用新 API:
import com.alibaba.fastjson2.JSONObject;
JSONObject obj = JSONObject.parseObject(jsonStr);
5. 自定义解析配置
  • 解决方案:使用 FastJSON 的配置选项忽略某些错误。
// 允许单引号、未引号的字段名等宽松格式
JSONObject obj = JSON.parseObject(jsonStr, Feature.AllowSingleQuotes, Feature.AllowUnQuotedFieldNames);

调试技巧

  1. 打印原始数据
System.out.println("Raw JSON: " + jsonStr);
System.out.println("Length: " + jsonStr.length());
// 打印前20个字符的Unicode编码
for (int i = 0; i < Math.min(20, jsonStr.length()); i++) {
    System.out.printf("Char %d: %c (U+%04X)%n", i, jsonStr.charAt(i), (int) jsonStr.charAt(i));
}
  1. 使用在线工具验证: 将打印出的原始 JSON 复制到 JSONLint 等工具中验证格式。
  2. 捕获详细错误
try {
    JSONObject obj = JSON.parseObject(jsonStr);
} catch (JSONException e) {
    // 打印更详细的错误信息
    System.err.println("JSON Parse Error: " + e.getMessage());
    // 打印错误位置附近的上下文
    int errorPos = extractPositionFromErrorMessage(e.getMessage());
    if (errorPos >= 0 && errorPos < jsonStr.length()) {
        int start = Math.max(0, errorPos - 20);
        int end = Math.min(jsonStr.length(), errorPos + 20);
        System.err.println("Error around: " + jsonStr.substring(start, end));
    }
    throw e;
}

通过以上方法,你应该能够定位并解决 FastJSON 的解析错误。如果问题仍然存在,请提供具体的 JSON 数据样本以便进一步分析。