1. 背景
今天在群里看到小伙伴遇到@ObservedV2的类实例目前不支持使用JSON.stringify进行序列化,这个问题其实官方有讲到:@ObservedV2装饰器概述,但是不知道为啥不解决。
2. 原因
@ObservedV2装饰器 修饰的类中会将所有属性代理一遍,前缀会拼接__ob_前缀,导致JSON.stringify 输出的属性全部拼接__ob_
3. 解决办法
封装一个方法,遍历类中的所有属性,判断如果属性前缀有__ob_ ,则去除__ob_,代码如下
export class JSONUtils {
static stringifyTraceObj(obj: ESObject | ESObject[]): string {
// 处理数组类型
if (Array.isArray(obj)) {
const newArray: ESObject[] = []
obj.forEach((item: ESObject, key) => {
newArray[key] = JSONUtils.stringifyTraceObj(item);
})
return JSON.stringify(newArray);
}
// 处理普通对象
if (obj && typeof obj === 'object') {
const newObj: ESObject = {}
Object.keys(obj).forEach((key) => {
if (obj.hasOwnProperty(key)) {
const newKey = key.replace(/(__ob_)/g, '')
newObj[newKey] = JSONUtils.stringifyTraceObj(obj[key])
}
})
return newObj;
}
return JSON.stringify(obj)
}
}
4. 注意
stringifyTraceObj 只是我临时写的代码,实际没有在业务中正式使用,大家可根据自己的业务,继续完善,例如:涉及到类嵌套类的场景,使用plainToInstance 的场景、等等。