HarmonyOS官方推荐的解析model的方式是什么?

我们从网络上访问得到了一个字段比较多的Object,里面拥有的字段基本都是某个model中的字段,比如jsonmodel这个class里面的字段,请问如何把这个object当成jsonmodel使用,官方推荐的object转model的方式是什么?

  1. 强行使用as ?这样可能封装多层以后会被误认为就是jsonmodel类,然后调用jsonmodel中的方法结果crash了
  2. 写一个ts文件,使用ts的动态属性,new出来一个jsonmodel然后把对应的字段属性利用[]下标的方式全部读取出来赋值然后export到ets文件
  3. 自己在ets文件中new出来一个jsonmodel,然后一个个去手动给属性赋值,如果存在某个属性需要进行转换,就继承jsonmodel生成一个新的属性一个个去赋值
阅读 448
1 个回答

可以通过引入三方库 reflect-metadata 和 class-transformer,参考如下demo实现:

//TestJson.ets
import { plainToClass, Type } from 'class-transformer';
import 'reflect-metadata';
import { Person, ViewA } from './ViewA';

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%')
  }
}

//ViewA.ets
import { Type } from 'class-transformer'

@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 })
  }
}

可以使用ohpm 引入三方库

ohpm install class-transformer

ohpm install reflect-metadata

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进