HarmonyOS 鸿蒙Next中类似Gson的写法在Arkts中怎么写

发布于 1周前 作者 eggper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next中类似Gson的写法在Arkts中怎么写

类似Gson这种 写法 在Arkts中怎么写 json 转 map 或者list 数组

3 回复

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。

回到顶部