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

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

但是我想拷贝这种类的对象要怎么做???

2 回复

关于这个是序列化后会有__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() {
    // 当点击改变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;
 }
}

更多关于@ObservedV2的类实例目前不支持使用JSON.stringify进行序列化 HarmonyOS 鸿蒙Next的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,@ObservedV2的类实例目前不支持使用JSON.stringify进行序列化。@ObservedV2是鸿蒙系统中的一个注解,用于标记需要被观察的类,以便在数据变化时自动更新UI。由于@ObservedV2的设计目的是与鸿蒙的UI框架深度集成,其内部可能包含了一些与UI状态相关的特殊属性或方法,这些属性或方法并不适合通过JSON.stringify进行序列化。

JSON.stringify是JavaScript中的一个内置函数,用于将JavaScript对象转换为JSON字符串。它通常只序列化对象中可枚举的自有属性,而忽略函数、Symbol和原型链上的属性。对于@ObservedV2的类实例,由于其内部可能包含不可枚举的属性或与UI状态相关的特殊数据,JSON.stringify无法正确处理这些内容,导致序列化失败或结果不符合预期。

如果需要序列化@ObservedV2的类实例,可以考虑手动提取需要序列化的数据,或者使用其他适合鸿蒙系统的序列化方法。

回到顶部