JS如何解析大体积的JSON文件

1,047 阅读3分钟

一、解析JSON文件

1、打开JSON文件。在JS中,可以使用文件读取器(FIleReader)对象来读取本地文件。我们在HTML文件中添加一个文件选择输入框。用于上传要解析的JSON文件

   <input type="file" id="fileInput" accept='application/json'/>

在Script中,可以通过以下代码获取文件上传表单元素,并添加change事件监听器

const fileInput=document.getElementById('fileInput'); 
fileInput.addEventListener('change',handleFileUpload);

2、在change事件的处理函数中,获取用户选择的文件,并读取文件内容:

 function handleFileUpload(event){     
      // event.target.files[0]上传的第一个文件     
      const file=event.target.files[0];     
      // FileReader对象允许Web应用程序异步读取存储在用户计算机上的文件内容。new FileReader()创建实例     
      const reader=new FileReader();     
      // onload方法:当读取操作完成时调用,不管是成功还是失败        
      reader.onload=function(e){        
           const fileContent=e.target.result;        
           // 将JSON字符串转换为JS对象或者数组        
           const jsonData=JSON.parse(fileContent);        
           // 可以对数据进行下一步操作了        
           console.log('jsonData------',jsonData);  
           }

3、面对大型JSON文件可能会对性能和内存消耗造成一定影响。可以采取以下优化手段:

  • 使用流式解析:当处理大型JSON文件时,可以考虑使用流式解析器,以避免将整个文件内存加载到内存中

  • 分批处理:如果文件太大无法一次性加载到内容中,可以考虑将文件分成多个批次进行处理

  • 压缩文件:如果文件过大,可以将其压缩为gzip格式,以减小传输和加载的大小

  • 使用Web Worker:可以将JSON解析的任务放到Web Worker中,以充分利用多核处理器的能力

------------------于是我尝试了使用流式解析看看----------------------------------

二、使用流式解析

"JSONStream 是一个流式 JSON 解析器库,它可以有效地处理大型 JSON 数据文件,而无需将整个文件加载到内存中。这对于处理大型JSON数据非常有用,因为它可以减少内存的占用。"

  • 轻量级:JSONStream的代码库非常小巧,便于集成到现有项目中

  • 高性能:流式处理允许在数据到达时立即处理,无需等待整个文件加载完成,提高了整体性能

  • 易于使用:基于事件驱动的API设计使得开发者可以快速上手并实现复杂的数据处理逻辑

  • 兼容性好:适用于多种Node.js版本,同时支持CommonJS和ESM导入方式

  • 灵活性高:支持自定义解析器和生成器,以便满足特定需求

1、流式解析器JSONStream,可以通过npm install命令来安装它

npm install JSONStream

2、新建一个js文件,在文件中编写如下代码即可实现大型JSON文件的解析

// 文件系统模块,是Node.js核心模块 
const fs = require('fs'); 
const JSONStream = require('JSONStream');   
// fs.createReadStream()创建了一个读取大文件的流,然后将其传递给JSONStream.parse('*'), 
fs.createReadStream('bigJson.json').pipe(JSONStream.parse('*'))     
// pipe(JSONStream.parse('*'))会将JSON文件中的每个对象都作为单独的事件触发。    
.on('data', data => {         
    // 在data事件处理器中,可以自由处理每个JSON对象         
    console.log(data);     
})     
.on('end', () => {         
    console.log('所有数据已处理完毕');              
 });

JSONStream.parse('*')中的'*'代表通配符,表示解析所有的键值对。如果JSON文件里的数据如下:

[{ 'key': '12345', 'value':'nihao', }, { 'key': '7899', 'value':'morning', }]

想要提取的只是键名为key的对象,那可以改写成JSONStream.parse('*.key.*'),表示匹配 JSON 对象中所有属性名为 'key' 的值,并提取出它们及其对应的值。