大json字符串处理

news/2024/9/29 14:59:07

背景:

当从API获取数据或与其他系统交换信息时。有时json字符串可能会非常庞大,以至于读取到内存中会导致内存溢出或者性能问题

流式处理

如果JSON字符串过大,不适合一次性加载到内存中,可以考虑使用流式处理。例如,使用Jackson库的JsonParser,可以逐行解析JSON,从而避免一次性加载整个字符串。

一般大json中都会存在某个数组中有超多的数据记录,我们需要解决的就是记录当前token路径,在读取到超大json数组时,再利用逐条数据读取mapper.readTree(jsonParser)逐条读取数据,利用数组缓存一定量的数据后,写入数据库后继续读取,直到json数组数据读取结束

ObjectMapper mapper = new ObjectMapper();
JsonParser parser = mapper.getFactory().createParser(jsonStream);

JsonParser进行解析的大致流程如下:

  1. 从头开始扫描JSON字符串
  2. 依次识别每个JSON组成元素
  3. 解析到结束位置,关闭解析器

分块读取

如果从网络或文件中读取JSON,可以使用缓冲区分块读取,而不是一次性读取整个文件。例如,使用Java NIO的BufferedReader。

Path path = Paths.get("large.json");
StringBuilder jsonBuilder = new StringBuilder();
try (BufferedReader reader = Files.newBufferedReader(path)) {String line;while ((line = reader.readLine()) != null) {jsonBuilder.append(line).append("\n");}
} catch (IOException e) {e.printStackTrace();
}
String jsonString = jsonBuilder.toString();

使用第三方库

有些库如Gson、Jackson提供了直接从输入流中解析JSON的功能,无需将整个JSON字符串加载到内存中。

InputStream inputStream = new FileInputStream("large.json");
Gson gson = new Gson();
YourModel model = gson.fromJson(inputStream, YourModel.class);
inputStream.close();

总结:

处理大型JSON字符串时,要避免一次性加载到内存中,以免造成内存溢出。通过使用StringBuilder、流式处理、分块读取或者借助第三方库,保证性能,又能避免内存问题。

 

背景:

酒店报价接口,会返回大量结构复杂的json数据,当需要追踪返回数据时非常困难,因此需要有清晰json解析方法

方法设计:

public class HotelTest {@Testpublic void test() throws IOException {//读取resource目录下的.json文件中的几个字段的值// 获取资源文件ClassLoader classLoader = getClass().getClassLoader();InputStream inputStream = classLoader.getResourceAsStream("execption.json");// 读取文件内容ObjectMapper objectMapper = new ObjectMapper();JsonNode jsonNode = objectMapper.readTree(inputStream);// 提取所需字段JsonNode nestedNode = jsonNode.path("data").path("rooms");for (JsonNode room : nestedNode) {JsonNode room1 = room.path("rateplans");//通过rateplan判断多个rateplan是不是同质化房型List<SymRoom> symRooms = new ArrayList<>();for (JsonNode rateplan : room1) {//room1是第一个房型的所有报价对象,rateplan是其中一个报价对象String paymentType = rateplan.get("paymentType").asText();String breakfast = rateplan.get("breakfast").asText();String status = rateplan.get("status").asText();String customerType = rateplan.get("customerType").asText();String daysMin = rateplan.get("daysMin").asText();Double totalRate = rateplan.get("totalRate").asDouble();String refundType = rateplan.get("refundType").asText();String refundTime = rateplan.get("refundTime").asText();String refundDesc = rateplan.get("refundDesc").asText();//组装对象SymRoom symRoom = new SymRoom();symRoom.setPaymentType(paymentType);symRoom.setBreakfast(breakfast);symRoom.setStatus(status);symRoom.setCustomerType(customerType);symRoom.setDaysMin(daysMin);symRoom.setTotalRate(totalRate);symRoom.setRefundType(refundType);symRoom.setRefundTime(refundTime);symRoom.setRefundDesc(refundDesc);symRooms.add(symRoom);// 打印提取的字段值System.out.println("paymentType: " + paymentType);System.out.println("breakfast: " + breakfast);System.out.println("status: " + status);System.out.println("customerType: " + customerType);System.out.println("daysMin: " + daysMin);System.out.println("totalRate: " + totalRate);System.out.println("refundType: " + refundType);System.out.println("refundTime: " + refundTime);System.out.println("refundDesc: " + refundDesc);System.out.println("totalRate是否为空:" + Objects.isNull(totalRate));System.out.println("====================================");}}}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66182.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

一文读懂 Git fetch 和 Git pull 的终极区别(带实验结果)

Git pull 是一个 Git 命令用来同时执行 git fetch 和 git merge。本文分享了这两个命令的区别和用法。 Git 命令是非常流行的,尤其是在分布式版本控制系统中,可以对远端的仓库进行同步。开发者需要根据项目实际所需来选择合适的命令。在本文章中,我们将解释 git fetch 和 g…

pbootcms的图片裁剪确保无论图片是横图还是竖图,都能居中裁剪

解决方案找到裁剪缩略图的方法:文件位置:/core/function/file.php 搜索:function cut_img,大约在447行优化cut_img方法:实现居中裁剪功能优化代码 以下是优化后的cut_img函数代码: // 剪切图片 function cut_img($src_image, $out_image = null, int $new_width = null, …

Online DDL

MySQL在线DDL特性提供了即时支持instant 、copy方式,还有原表in-place方式。有些过程中也允许并发DML。 语法:ALTER TABLE tbl_name , alter_option: {...}, ALGORITHM [=] {DEFAULT | INSTANT | INPLACE | COPY} LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}为了避免在执…

pbootcms提示提交失败,请使用POST方式提交

在PbootCMS中,如果你在模板在线留言功能中遇到“提交失败,请使用POST方式提交!”的错误,通常是因为URL名称使用了系统保留的关键字。为了避免这类问题,可以遵循以下建议: 1. 系统保留关键字 PbootCMS系统中有一些保留的关键字,这些关键字不能用作URL名称。以下是一些常见…

ElementUI中实现el-table表格列宽自适应,列根据内容自动撑满,内容不换行

一、概述 在表格宽度固定时,实现内容不换行,表格自动显示滚动条 当前显示效果: 期望实现效果: 二、实现思路 遍历表格数组,每次都构建一个隐藏的span元素,获取该元素的宽度,对比保存最大值 代码如下:```typescript /*** 表格列宽自适应* @param prop 属性* @param reco…

PbootCMS模板如何调用友情链接

在PbootCMS中,使用友情链接标签可以方便地输出指定分组的友情链接。下面是一个详细的示例,展示了如何使用该标签以及如何控制输出的内容。 友情链接标签示例 1. 基本用法{pboot:link num=3 gid=1}<a href="[link:link]" target="_blank">[link:nam…

getBeansOfType源码解析

org.springframework.beans及org.springframework.context这两个包是Spring IoC容器的基础,其中重要的类有BeanFactory,BeanFactory是IoC容器的核心接口,其职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖关系。 ApplicationContext作为BeanFactory的子…

KubeSphere 社区双周报|2024.09.13-09.26

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2024.09.13-09.26。 贡献者名单新晋 KubeSphere co…