回复
#HarmonyOS NEXT体验官# ArkTS 中Json 转Class 原创
冉冉同学
发布于 2024-8-1 11:09
浏览
0收藏
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 = -1
msg = ""
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
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
4 更多高级用法
关于 class-transformer 更详细的介绍可以看这里
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
赞
收藏
回复
相关推荐