文档开发者中心
我的
|

HarmonyOS 5

@ObservedV2的类实例目前不支持使用JSON.stringify进行序列化。

@ObservedV2的类实例目前不支持使用JSON.stringify进行序列化。
但是我想拷贝这种类的对象要怎么做???
 
点赞
收藏
回复
2
分享
举报
浏览334 发布于2025-03-05 06:18广东
全部评论
最多点赞
最新发布
最早发布

方式一:

收起
自动换行
深色代码主题
复制
JSON.stringify(objV2).replaceAll('__ob_','')

方式二:使用class-transformer库

@Observed类的属性加上@Expose装饰器

收起
自动换行
深色代码主题
复制
//排除掉__ob_前缀的字段
  let jsonStr = JSON.stringify(instanceToPlain(objV2,{ excludePrefixes:['__ob_']}))

具体可参考我写的这篇文章:

关于ObservedV2对象的序列化和反序列化的问题

2楼回复于2025-09-30 08:50 来自广东

关于这个是序列化后会有__ob_前缀的问题,可以在序列前替换掉__ob_前缀,demo如下

收起
自动换行
深色代码主题
复制
import  { plainToClass } from "class-transformer";
@ObservedV2
class Son {
  @Trace age: number = 100;
}
class Father {
  son: Son = new Son();
}
@Entry
@Component
struct Index {
  father: Father = new Father();
  aboutToAppear(): void {
    let a = JSON.stringify(this.father);
    let b: Father = plainToClass(Father,this.father);
    //{"son":{"__ob_age":100}}替换成{"son":{"age":100}}
    console.log(JSON.stringify(convertKeysToCamelCase(this.father)))
  }

  build() {
    Column() {
      // 当点击改变age时,Text组件会刷新
      Text(`${this.father.son.age}`)
        .onClick(() => {
          this.father.son.age++;
        })
    }
  }
}

// utils.ets
export function underscoreToCamelCase(underscoreString:string):string {
  // 捕获__ob_替换成''
  return underscoreString.replace(/(__ob_)/g, (match:string, letter:string):string=> {
    console.log(letter)
    return '';
  });
}
export function convertKeysToCamelCase(obj:ESObject):ESObject {
  if (obj && typeof obj === 'object') {
    const newObj:ESObject = {};
    Object.keys(obj).forEach((key)=> {
    if (obj.hasOwnProperty(key)) {
      const newKey = underscoreToCamelCase(key);
      newObj[newKey] = convertKeysToCamelCase(obj[key]);
    }
  })
  return newObj;
 } else {
  return obj;
 }
}
展开全部
1楼回复于2025-03-06 03:34 来自广东
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要提问题

了解社区公约,与您携手共创和谐专业的开发者社区。