OpenHarmony: 如何指定对象属性参与序列化

2024-12-18 13:34:28
124次阅读
0个评论

一、序列化需求与 JSON.stringify() 接口

在 ArkTS 编程中,常常会面临将对象转换为 JSON 字符串的需求,而在这个过程中,有时我们并不希望对象的所有属性都参与序列化,而是仅指定某些属性进行转换。JSON.stringify() 接口为我们提供了强大的功能来实现这一目标。该接口的定义为 stringify(value: Object, replacer?: (number | string)[] | null, space?: string | number): string,其中关键的参数 replacer 为我们控制属性的序列化提供了便利。

二、replacer 参数的作用机制

replacer 为数组时,它就像是一把筛选器,只有那些包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中。这使得我们能够精准地选择需要序列化的对象属性,从而得到更符合需求的 JSON 数据。例如,在某些场景下,我们可能只关心对象中的部分关键信息,如用户对象中的姓名和年龄,而其他信息如注册时间、上次登录时间等则无需在当前序列化操作中包含。通过将 replacer 设置为包含 nameage 的数组,就可以轻松实现仅这两个属性的序列化。

相反,当 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 接口,包含 nameagecity 三个属性。接着创建了一个 Person 类型的对象 obj,并初始化了相应的属性值。在 JSONDemo 组件的构建函数 build() 里,创建了一个包含按钮的布局结构。当按钮被点击时,会执行两个 JSON.stringify() 操作。

第一个操作 JSON.stringify(obj) 由于未提供 replacer 参数,按照默认规则,对象 obj 的所有属性都参与序列化,生成的 JSON 字符串包含了 nameagecity 三个属性的信息,即 {"name":"John","age":30,"city":"ChongQing"}

第二个操作 JSON.stringify(obj, ['name']),通过将 replacer 设置为只包含 name 属性的数组,使得只有 name 属性被序列化到最终的 JSON 字符串中,结果为 {"name":"John"}。这清晰地展示了 replacer 参数在控制对象属性序列化过程中的关键作用,提高了 ArkTS 应用在数据处理和传输方面的灵活性与精准性。

收藏00

登录 后评论。没有帐号? 注册 一个。