json转自定义class对象时需要将class对象new出来,这样才是真正转成了class对应的model。如果数据结构比较复杂、数据量比较大,不想在解析的时候每个对象都new一次,建议使用第三库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 TestJson { @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, 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('') } @Component export struct ViewA { @ObjectLink testA: TestA index: number = -1; build() { Row() { Button(`View A ${this.testA.str}`).onClick(() => { this.index += 1; this.testA.str = `${this.index} : Test A String` }) }.margin({ top: 10 }) } }
json转自定义class对象时需要将class对象new出来,这样才是真正转成了class对应的model。如果数据结构比较复杂、数据量比较大,不想在解析的时候每个对象都new一次,建议使用第三库reflect-metadata和class-transformer。
安装方法:
参考代码: