OpenHarmony: 如何指定对象属性参与序列化
一、序列化需求与 JSON.stringify() 接口
在 ArkTS 编程中,常常会面临将对象转换为 JSON 字符串的需求,而在这个过程中,有时我们并不希望对象的所有属性都参与序列化,而是仅指定某些属性进行转换。JSON.stringify() 接口为我们提供了强大的功能来实现这一目标。该接口的定义为 stringify(value: Object, replacer?: (number | string)[] | null, space?: string | number): string,其中关键的参数 replacer 为我们控制属性的序列化提供了便利。
二、replacer 参数的作用机制
当 replacer 为数组时,它就像是一把筛选器,只有那些包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中。这使得我们能够精准地选择需要序列化的对象属性,从而得到更符合需求的 JSON 数据。例如,在某些场景下,我们可能只关心对象中的部分关键信息,如用户对象中的姓名和年龄,而其他信息如注册时间、上次登录时间等则无需在当前序列化操作中包含。通过将 replacer 设置为包含 name 和 age 的数组,就可以轻松实现仅这两个属性的序列化。
相反,当 replacer 参数为 null 或者未提供时,JSON.stringify() 会遵循默认的行为,即对象所有的属性都会被序列化。这种全量序列化在某些情况下也是必要的,比如需要完整保存对象的所有信息以便后续的全面恢复或处理。
三、上代码
import { JSON } from '@kit.ArkTS';
interface Person {
  name: string;
  age: number;
  city: string;
}
let obj: Person = { name: 'John', age: 30, city: 'ChongQing' };
@Entry
@Component
struct JSONDemo {
  @State str: string = 'to json';
  build() {
    Row() {
      Column() {
        Button(this.str)
          .onClick(() => {
            let jsonStr1 = JSON.stringify(obj); // 所有属性都进行序列化
            console.info('jsonStr1:', jsonStr1); // jsonStr1: {"name":"John","age":30,"city":"ChongQing"}
            let jsonStr2 = JSON.stringify(obj, ['name']); // 指定name属性,进行序列化
            console.info('jsonStr2:', jsonStr2); // jsonStr2: {"name":"John"}
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}
首先定义了一个 Person 接口,包含 name、age 和 city 三个属性。接着创建了一个 Person 类型的对象 obj,并初始化了相应的属性值。在 JSONDemo 组件的构建函数 build() 里,创建了一个包含按钮的布局结构。当按钮被点击时,会执行两个 JSON.stringify() 操作。
第一个操作 JSON.stringify(obj) 由于未提供 replacer 参数,按照默认规则,对象 obj 的所有属性都参与序列化,生成的 JSON 字符串包含了 name、age 和 city 三个属性的信息,即 {"name":"John","age":30,"city":"ChongQing"}。
第二个操作 JSON.stringify(obj, ['name']),通过将 replacer 设置为只包含 name 属性的数组,使得只有 name 属性被序列化到最终的 JSON 字符串中,结果为 {"name":"John"}。这清晰地展示了 replacer 参数在控制对象属性序列化过程中的关键作用,提高了 ArkTS 应用在数据处理和传输方面的灵活性与精准性。
- 1回答
- 0粉丝
- 0关注
- OpenHarmony: 解决反序列化时number类型精度丢失
- 参与OpenHarmony开源项目的方式
- 鸿蒙开发:如何更新对象数组
- @Observed & @ObjectLink装饰器-嵌套类对象属性变化更新UI
- OpenHarmony 开发的艺术 面向对象
- OpenHarmony 动画大全01-属性动画
- HarmonyOs开发:组件如何实现属性的动态设置
- 如何获取状态管理框架代理前的原始对象
- 【HarmonyOS】深入理解@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化
- HarmonyOS如何实现Text根据对应的字符串改变Text中字符指定颜色?
- OpenHarmony: 如何主动退出整个应用
- OpenHarmony 如何优雅的编写注释
- 鸿蒙开发:openCustomDialog关闭指定Dialog
- OpenHarmony: 如何删除Record中的元素
- OpenHarmony: 如何获取当前HAP的BundleName
