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
相关产品推荐
相关产品推荐

