1. 背景
由于本菜鸡是从Android 开发转而学习HarmonyOS NEXT开发的,所以在ArkTS中解析接口返回的JSON数据时,习惯将JSON字符串转为Data Class 而不是前端中的interface 或者JSONObject。
2. 问题
在ArkTS中,想要将JSON 转为Class,最常见的方法就是 as Class,但是这种写法有一个很严重的问题,就是as 后的Class 中的function 方法丢失了,例如下面的代码,使用class中的isOk 方法时,会报错提示找不到该方法。
class DataBean {code = -1msg = ""isOk() {return this.code == 0}
}let json = `{"code":0,"msg":"success"}`
let dataBean = JSON.parse(json) as DataBean
console.log(dataBean.msg)//success
console.log(`${dataBean.isOk()}`);//error 报错 is not callable
3. 解决办法
使用框架 https://ohpm.openharmony.cn/#/cn/detail/class-transformer
关于 class-transformer 更详细的介绍可以看这里 https://juejin.cn/post/6904890590602330119
3.1. 安装
ohpm i class-transformer
3.2. 封装
//JSONUtils.ts
import { plainToClass, ClassConstructor, instanceToPlain } from "class-transformer";export default class JSONUtils {/*** JSON字符串转Class对象* @param cls 类名* @param jsonStr json 字符串* @returns class对象*/static json2Bean<T>(cls: ClassConstructor<T>, jsonStr: string): T | null {try {return plainToClass(cls, JSON.parse(jsonStr), {enableImplicitConversion: false, exposeDefaultValues: true}) as T} catch (e) {return null}}/*** 对象转字符串* @param data* @returns 字符串*/static bean2Json(data: Object | Array<Object | String | Number | Boolean> | null | undefined): string {try {if (data == null || data == undefined) {return ''}return JSON.stringify(instanceToPlain(data))} catch (e) {return ""}}/*** JSON转Map* @param jsonStr* @returns*/static json2Map(jsonStr: string): Map<string, Object> {return new Map(Object.entries(JSON.parse(jsonStr)));}
}
3.3. 使用
import JSONUtils from '../JSONUtils'
let json = `{"code":0,"msg":"success"}`
let dataBean = JSONUtils.json2Bean(DataBean,json)
console.log(dataBean?.msg)//success
console.log(`${dataBean?.isOk()}`)//true