一、解析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' 的值,并提取出它们及其对应的值。