HarmonyOS 鸿蒙Next中类似Gson的写法在Arkts中怎么写
HarmonyOS 鸿蒙Next中类似Gson的写法在Arkts中怎么写
reflect-metadata 和 class-transformer,是否能满足需求 安装方法:
ohpm install class-transformer
ohpm install reflect-metadata
参考代码:
import 'reflect-metadata';
import { plainToClass, Type } from 'class-transformer';
class ResponseObj {
@Type(() => Person)
data: Person[] = [];
}
@Entry
@Component
struct Index9 {
@State list: Person[] = [];
@State message: string = 'Click me';
aboutToAppear(): void {
let str = '{"data" : [{"number" :1,"age": 20, "testA": { "str" : "123"}},{"number" :2,"age": 21,"testA": {"str" : "456"}}]}'
let jsonData: ESObject = JSON.parse(str)
let responseObj: ResponseObj = plainToClass(ResponseObj, jsonData);
console.log( `${responseObj.data[0] instanceof Person}`)
this.list = this.list.concat(responseObj.data);
}
build() {
Row() {
Column() {
ForEach(this.list, (item: Person, index: number) => {
ViewA({ index: index,age:item.hasAge(), testA: item.testA })
})
}
.width('100%')
}
.height('100%')
}
}
@Observed
export class TestA {
public str : string
constructor(str: string) {
this.str = str;
}
}
export class Person {
name: string = ''
age: number = 1
@Type(()=>TestA)
testA: TestA = new TestA('')
hasAge():number
{
return this.age
}
}
@Component
export struct ViewA {
@ObjectLink testA: TestA
index: number = -1;
age:number = 0
build() {
Row(){
Button(`View A ${this.testA.str}`).onClick(() =>{
this.index += 1;
this.testA.str = `${this.index} : Test A String ${this.age}`
})
}.margin({top : 10 })
}
}
尊敬的开发者,您好,
关于您的反馈的问题,
可以尝试使用以下方案:
1.封装工具类:
import { ClassConstructor, instanceToPlain, plainToClass } from 'class-transformer';
import { BusinessError } from '@kit.BasicServicesKit';
static jsonToBean<T>(cls: ClassConstructor<T>, jsonStr: string): T | null {
try {
return plainToClass(cls, JSON.parse(jsonStr), { enableImplicitConversion: false, exposeDefaultValues: true }) as T
} catch (err) {
let error = err as BusinessError;
LogUtil.error(`JSONUtil-jsonToBean-异常 ~ code: ${error.code} -·- message: ${error.message}`);
return null
}
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
2.使用三方库 reflect-metadata 和 class-transformer
let jsonstr: string = ‘{“version”: “1.0.0”, “status”: 0}’
let js: string = JSON.parse(jsonstr)
let t: Test = plainToClass(Test, js)
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
class-transformer地址:https://gitee.com/openharmony-tpc/openharmony_tpc_samples/tree/master/class-transformer 本库提供对象和类之间基于修饰符的转换、序列化和反序列化的能力
reflect-metadata 地址:https://gitee.com/openharmony-tpc/openharmony_tpc_samples/tree/master/reflect-metadata 用于在TypeScript中操作类的元数据,允许在声明类和属性时添加和读取元数据。
【API 11 实践】高效处理HTTP响应:JSON转Class策略探索——class-transformer的实战应用-华为开发者问答专区 | 华为开发者联盟 (huawei.com)
合作愉快。
华为开发者联盟
在HarmonyOS鸿蒙系统的ArkUI(ArkTS)开发中,虽然ArkTS主要面向前端开发者,使用TypeScript或ECMAScript 6+语法,并且与Android原生开发中的Gson库在应用场景和技术栈上有所不同,但如果你需要将JSON数据解析为对象或者将对象序列化为JSON数据,可以使用JavaScript中广泛支持的JSON对象。
在ArkTS中,你可以使用原生的JSON.parse()
方法将JSON字符串解析为JavaScript对象,使用JSON.stringify()
方法将JavaScript对象序列化为JSON字符串。以下是一个简单的示例:
// JSON字符串
const jsonString = '{"name": "HarmonyOS", "version": "3.0"}';
// 解析JSON字符串为对象
const jsonObject = JSON.parse(jsonString);
console.log(jsonObject.name); // 输出: HarmonyOS
// 对象序列化为JSON字符串
const obj = { name: "ArkTS", feature: "Declarative UI" };
const json = JSON.stringify(obj);
console.log(json); // 输出: {"name":"ArkTS","feature":"Declarative UI"}
这种方法在ArkTS中处理JSON数据是非常直接和高效的。如果你在处理过程中遇到特定问题,比如复杂的嵌套结构或自定义的解析逻辑,可能需要额外编写处理函数。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。