You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle(Java)项目使用json-simple解析带转义JSON转实体类方法

你不需要手动处理源数据里的反斜杠转义符,解析阻塞的核心原因是外层JSON中raw字段存储的是字符串类型的JSON片段,而非嵌套JSON对象,需要做两次解析才能拿到目标字段。

核心逻辑说明

源数据里的反斜杠是JSON标准规定的合法转义格式:当JSON字段的值本身是一段JSON文本时,文本内部的双引号必须加反斜杠转义才能正常存储。当你用JSONParser解析外层JSON数组时,解析器会自动完成转义还原,你拿到的raw字段值本身就是没有多余反斜杠的合法JSON字符串,不需要自行写字符串替换、正则匹配逻辑处理转义。

可直接运行的实现代码

补全你现有while循环的逻辑即可,完整参考代码如下:

// 注意引入java.nio.charset.StandardCharsets避免硬编码字符集
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("data.json");
JSONParser parser = new JSONParser();
List<Raw> parsedResult = new ArrayList<>();
// 用try-with-resources自动关闭流,避免资源泄漏
try (InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8)){
    JSONArray jsonArr = (JSONArray) parser.parse(reader);
    // 给迭代器指定泛型,消除原始类型警告
    Iterator<JSONObject> iterator = jsonArr.iterator();
    while(iterator.hasNext()) {
        JSONObject outerItem = iterator.next();
        // 1. 取外层的raw字段值,此时转义已经被解析器自动处理完成
        String rawJsonStr = (String) outerItem.get("raw");
        // 2. 对raw字段的字符串做二次解析,拿到内部的字段对象
        JSONObject innerItem = (JSONObject) parser.parse(rawJsonStr);
        // 3. 提取字段构造目标实体
        Raw rawInstance = new Raw(
                (String) innerItem.get("productId"),
                (String) innerItem.get("productType"),
                (String) innerItem.get("productDate")
        );
        parsedResult.add(rawInstance);
    }
} catch (IOException | ParseException e) {
    // 这里替换成你自己的异常处理逻辑
    e.printStackTrace();
}

避坑提示

  • 请确认你的data.json存放在src/main/resources目录下,而非项目根目录的/resource文件夹,否则Gradle编译时不会将文件打入classpath,会触发空指针异常。
  • 你当前引入的json-simple 1.1.1版本中,parser.parse()方法会抛出受检异常ParseException,catch块需要同时捕获该异常和IOException,否则代码无法编译通过。
  • 所有转义处理交给JSONParser完成即可,手动删除反斜杠的逻辑会在内容本身包含反斜杠时引发解析错误,不建议使用。

内容的提问来源于stack exchange,提问作者user842225

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:27:24