前言 在某些后台业务场景下,可能需要导出或导入一些数据;而这个数据的介质就是json文件。从服务端获取到的json数据可以转为json文件并下载,而从用户导入的json文件又可以转换为json数据(对象)提交给服务端。
转换步骤 核心 无论是json数据转.json文件,还是.json文件转json数据,都离不开Blob对象的支持。
.json文件转为json数据(对象) 根据上传组件获取到对应的File对象; 将File对象转为Blob对象; 利用FileReader的readAsText方法读取json数据; FileReader的onload方法会在解析成功时执行;此时该实例的result属性就是解析好的json字符串,进一步用JSON.parse()方法就能解析出json对象。 可以将上述步骤封装成一个函数:
/**
将file对象(.json文件)转为json对象@param {File} file file对象 */ function fileToJson (file) { return new Promise((resolve, reject) => { const reader = new FileReader() reader.onload = res => { const { result } = res.target // 得到字符串 const data = JSON.parse(result) // 解析成json对象 resolve(data) } // 成功回调 reader.onerror = err => { reject(err) } // 失败回调 reader.readAsText(new Blob([file]), ‘utf-8’) // 按照utf-8编码解析 }) } json数据(对象)转为Blob对象 由于Blob构造函数本身就支持将字符串转为文件,因此转换比较简单:首先利用JSON.stringify()方法将json对象转为json字符串; 利用Blob构造函数得到Blob对象(注意:需要设置文件的MIME类型); 如:
const blob = new Blob([JSON.stringify(data)], { type: ‘application/json’ }) 扩展:将Blob对象直接下载到本地 上面将json数据转换为Blob对象后,作用并不大;一个后续的使用场景可能为:将这个文件通过浏览器下载到本地。这个就需要用到createObjectURL()方法和<-a>标签的download特性了。
URL.createObjectURL(blob/file):该方法可以得到一个指向Blob对象或File对象对应的二进制文件流的url地址,访问即可下载该文件; download属性:当<-a>标签设置了该属性时,点击标签时浏览器不会跳转链接,而是将对应链接作为文件进行下载保存,而文件的名字就是download的属性值。 可以将上述流程封装成一个将json对象转化成文件并自动下载的函数:
* 利用a标签的download属性和blob转url,将json字符串转为json文件进行下载 * @param {*} data json对象 */ function downloadJson (data) { const download = document.createElement('a') // 匿名a标签 const blob = new Blob([JSON.stringify(data)], { type: 'application/json' }) const url = URL.createObjectURL(blob) // blob转url download.href = url download.download = 'filename.json' // 文件名 download.click() // 触发下载 }