【HarmonyOS NEXT】解决V2状态管理 @ObservedV2的类实例不支持JSON.stringify进行序列化的问题

512 阅读1分钟

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 的场景、等等。