首页 > 其他分享 >大json字符串处理

大json字符串处理

时间:2024-09-29 14:50:20浏览次数:9  
标签:处理 rateplan System println json symRoom 字符串 out

背景:

当从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 {
  @Test
  public 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("====================================");
          }
      }
  }
}

 

标签:处理,rateplan,System,println,json,symRoom,字符串,out
From: https://www.cnblogs.com/complexlong/p/18439815

相关文章

  • 推出TMS320VC5416GWS120、TMS320VC5416PGE160、TMS320VC5416ZWS160定点数字信号处理器
    系列概述:TMS320VC5416定点数字信号处理器(DSP)基于先进的改进型哈佛架构打造,具有一条程序存储器总线和三条数据存储器总线。该处理器采用具有高并行能力的算术逻辑单元(ALU)、特定于应用的硬件逻辑、片上存储器和附加片上外设。高度专业化的指令集是TMS320VC5416操作灵活性和速度的基......
  • matlab-批处理图像质量变化并形成折线图 (PSNR)
    %修改路径就能用,图片分辨率要一致%clc;clearall;closeall;tic;%清理内存file_path='E:\test\resources\image\';%批量图像所在的文件夹下file_save_path='E:\test\resources\SaveImage\';%要存储的地址img_path_list=dir(strcat(file_path,'*.jpg'));%获取批量bmp格式......
  • 火语言RPA流程组件介绍--处理网页对话框
    ......
  • 脑电数据MNE预处理分析步骤与说明(个人总结版不断完善中)
    1.加载数据:加载原始数据到MNE中。2.加载电极位置信息:加载电极配置。3.查看原始信号:plot查看信号,插值坏导。(无坏导就不需要做)4.滤波:带通滤波0.1-60hz,陷波去除50hz工频干扰。5.独立成分分析:运行ICA分析,画出ICA各成分地形图。6.去除眼电伪迹:根据ICA各成分地形图去除眼电成分,......
  • Spring Boot 进阶-Spring Boot的全局异常处理机制详解
      我们知道在软件运行的过程中,总会出现各种各样的问题,各种各样的异常,而程序员的主要任务之一就是解决在程序运行过程中出现的这些异常。在很多程序员开发的代码中我们会看到在关键的地方为了保证程序能够有一个正常的反馈,大量地使用了trycatchfinally语句。  大量的......
  • 在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
    前言:什么是操作筛选器操作筛选器是ASP.NETCoreWebAPI中的一种过滤器,用于在执行控制器操作(Action)之前或之后执行一些代码,完成特定的功能,比如执行日志记录、身份验证、授权、异常处理等通用的处理逻辑。每次ASP.NETCoreWebAPI中控制器的操作方法被执行的时候,操作筛选器......
  • 【C语言】字符函数和字符串函数(1)
    文章目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现四、strcpy的使用和模拟实现五、strcat的使用和模拟实现六、strcmp的使用和模拟实现一、字符分类函数  C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的,这些......
  • 猜拳数据集-石头-剪刀-布数据集-YOLOv9 - YOLOv8 - YOLOv5 - YOLOv7 - COCO JSON - YO
    “石头-剪刀-布”计算机视觉项目是一个利用摄像头捕捉手势并识别出手势是石头、剪刀还是布的项目。这类项目通常用于学习和展示计算机视觉技术,如图像处理、特征提取以及机器学习或深度学习模型的应用。数据介绍rock-paper-scissorsComputerVisionProject数据集信息......
  • 《Linux从小白到高手》理论篇(三):vi/vim编辑器和Linux文件处理“三剑客”(sed/grep/awk)
    Listitem本篇介绍vi/vim编辑器和Linux文件处理“三剑客”(sed/grep/awk),这5个工具命令可能是Linux最最常用的,而且功能超级强大。vi/vimvi和vim的基本介绍所有的Linux系统都会内建vi文本编辑器。Vim具有程序编辑的能力,可以看做是Vi的增强版本,可以主动的以字体颜色辨......
  • 付费计量系统通用处理类(上)
            普通处理类如下定义:10.1Class1:Supply_Agreementprocess供应协议过程        ThelegalprocessesassociatedwithagreeingandestablishingtheSupplier’stermsandconditionsofsupplyandcapturingtheseintheContract.   ......