如何序列化类对象为字符串及递归转换ICoreFileStat的vscode-uri为字符串
如何将类实例对象序列化为字符串?以及递归转换ICoreFileStat中的vscode-uri实例为字符串
我来帮你一步步搞定这两个问题:
1. 将类实例对象序列化为字符串
序列化类实例的关键是把它转换成JSON能识别的普通对象,这里有两种实用方案:
方法一:给类添加toJSON()方法
JSON.stringify()在处理对象时会自动调用其toJSON()方法,你可以在类里定义这个方法,返回包含需要序列化属性的普通对象,还能顺便过滤掉不需要的内部属性:
class User { constructor(username, email) { this.username = username; this.email = email; this._internalId = 'xxx123'; // 不想对外暴露的内部属性 } toJSON() { return { username: this.username, email: this.email }; } } const userInstance = new User('john_doe', 'john@example.com'); const serializedStr = JSON.stringify(userInstance); console.log(serializedStr); // 输出: {"username":"john_doe","email":"john@example.com"}
方法二:使用JSON.stringify的replacer函数
要是没法修改类的代码,或者只需要临时处理某个实例,就用replacer函数来拦截转换过程:
class Product { constructor(id, name) { this.id = id; this.name = name; } } const productInstance = new Product(1, 'Laptop'); const serializedStr = JSON.stringify(productInstance, (key, value) => { // 判断当前值是否是Product类的实例 if (value instanceof Product) { return { id: value.id, name: value.name }; } // 其他类型直接返回 return value; }); console.log(serializedStr); // 输出: {"id":1,"name":"Laptop"}
2. 递归转换ICoreFileStat中的vscode-uri实例为字符串
vscode-uri的实例自带toString()方法,刚好能输出你要的file:///xxx格式字符串。我们写一个递归函数,遍历整个ICoreFileStat对象,遇到URI实例就转成字符串,嵌套的对象或数组继续递归处理:
import { URI } from 'vscode-uri'; // 递归处理函数:把所有URI实例转为字符串,返回普通对象 function transformUrisToStrings(obj) { // 处理数组:遍历每个元素递归转换 if (Array.isArray(obj)) { return obj.map(item => transformUrisToStrings(item)); } // 处理对象(排除null和基础类型) if (obj !== null && typeof obj === 'object') { // 判断是否是vscode-uri的URI实例 if (obj instanceof URI) { return obj.toString(); // 转为file:///格式的字符串 } // 遍历对象的所有属性,递归处理 const plainObj = {}; for (const key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { plainObj[key] = transformUrisToStrings(obj[key]); } } return plainObj; } // 基础类型(字符串、数字、布尔等)直接返回 return obj; } // 示例使用:假设你有一个ICoreFileStat对象 const coreFileStat = { uri: URI.file('/index.js'), size: 2048, isDirectory: false, children: [ { uri: URI.file('/src/components/Button.js'), size: 512, modified: new Date('2024-01-01') } ] }; // 转换后得到普通对象 const resultObj = transformUrisToStrings(coreFileStat); console.log(resultObj); /* 输出结果: { uri: 'file:///index.js', size: 2048, isDirectory: false, children: [ { uri: 'file:///src/components/Button.js', size: 512, modified: '2024-01-01T00:00:00.000Z' } ] } */
如果之后需要把这个普通对象序列化为字符串,直接调用JSON.stringify(resultObj)就行。
内容的提问来源于stack exchange,提问作者user1595858
相关产品推荐
相关产品推荐

