HarmonyOS JSON生成接口没有replacer?

1、ArkTSUtils.ASON.stringify缺少replacer参数,JSON.stringify接口是有的

2、另外文档上没有针对ArkTSUtils.ASON.stringify和parse中Transformer详细demo,不知道如何使用,根据JSON的用法往里套,结果闪退,请问该如何使用

阅读 485
1 个回答

为支持将JSON字符串解析成共享数据,ArkTS语言基础库新增了ASON工具。

ASON支持开发者解析JSON字符串,并生成共享数据进行跨并发域传输,同时ASON也支持将共享数据转换成JSON字符串。

import { ArkTSUtils, collections, lang } from '@kit.ArkTS';

// JSON解析为Sendable数据
type ISendable = lang.ISendable;
let jsonText = '{"name": "John", "age": 30, "city": "ChongQing"}';
let obj = ArkTSUtils.ASON.parse(jsonText) as ISendable;

// Sendable数据序列化为JSON
let arr = new collections.Array(1, 2, 3);
let str = ArkTSUtils.ASON.stringify(arr);

1、复杂不明结构JSON需要解析为对象并获取修改对应值

通过ESObject接收parse出的JSON

let userResp:ESObject = {
  nickname: "一个很长的名字",
  avatar: "https://www.huawei.com/"
}
let data:ESObject = {
  roomId: "823688",
  nativeUrl: "native://enterLiveRoom?RoomId=823688",
  status: "1",
  userResp: [
    userResp
  ]
}
let jsonObj:ESObject= {
  reqId: "2b2258ae54e3101a",
  code: 0,
  msg: "success",
  data:data
}
let json:string = JSON.stringify(jsonObj)

let test:ESObject = JSON.parse(json)
console.info(test.msg)
console.info(test.data.userResp[0].nickname)

2、基于class-transformer的JSON数据转换成类实例对象的实践

安装/引入三方库

ohpm install class-transformer

ohpm install reflect-metadata

import { Type, plainToClass } from 'class-transformer'
import "reflect-metadata"
定义JSON数据
let testJSON: Record<string, ESObject> = {
  'id': 1,
  'firstName': "Johny",
  'lastName': "Cage",
  'age': 27,
  'arr': [
    {
      'name': 'john'
    },
    {
      'name': 'tom'
    }
  ],
  'instanceA': {
    'name': 'john'
  },
}
定义class对象
Class A
class A {
  name: string = 'john';

  getName(): string {
    return this.name;
  }
}
Class User
// 当尝试转换具有嵌套对象的对象时,需要知道要转换的对象类型,使用@Type装饰器隐式地指定每个属性包含的对象类型
class User {
  id: number = 0;
  firstName: string = '';
  lastName: string = '';
  age: number = 0;

  @Type(() => A)
  arr: A[] = [new A()]

  @Type(() => A)
  instanceA: A = new A();

  getName() {
    return this.firstName + " " + this.lastName;
  }

  isAdult() {
    return this.age > 36 && this.age < 60;
  }
}
转换结果
const instance = plainToClass(User, testJSON)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进