HarmonyOS鸿蒙Next中接口请求成功后赋值报错

HarmonyOS鸿蒙Next中接口请求成功后赋值报错 学鸿蒙开发的第3天,接口请求成功也能打印,但newsResult赋值一直报错,想问下代码如何修改,不确定是哪个环节有问题

class Userinfo {
  id: number;
  title: string;
  number: string;
  constructor(id:number,title:string,number:string){
    this.id = id;
    this.title = title;
    this.number = number;
  }
}
class tits {
  code: number;
  msg: string;
  time: string;
  data: Array<Userinfo>;
  constructor(code:number,msg:string,time:string,data:Array<Userinfo>){
    this.code = code;
    this.msg = msg;
    this.time = time;
    this.data = data;
  }
}

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  @State nums:string = '1';
  @State num2:string = '20';
  @State dataList: Userinfo[] = [];
  scroller: Scroller = new Scroller();

  aboutToAppear(): void {
    let httpRequest = http.createHttp();
    httpRequest.request('http://wmapp.xiaoyunba.com/api/index/kefu',{

    }).then((resp) => {
      console.info("---124调用后台接口返回---", JSON.stringify(resp.result))
      let newsResult:tits = resp.result;
    }).catch(() => {
      console.info("---接口错误信息---", "请求失败")
    })
  }
}

更多关于HarmonyOS鸿蒙Next中接口请求成功后赋值报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

【背景知识】

[@ohos.util.json.parse](https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-json-V5#jsonparse):用于解析JSON字符串生成对应ArkTS对象。

【问题分析】

通过调试发现,JSON.parse仅反序列化了对象的数据结构,并不支持映射到具体的类型,因此在调用具体的方法时会报错。此处仅使用ArkTS的JSON工具进行转换是不够的,还需要借助class-transformer等三方库才能够实现到具体类型的转换和映射。

【解决方案】

借助第三方库对JSON解析进行扩展,实现自动类型映射。需要用到的第三方库有以下两个:class-transformer和reflect-metadata。

使用class-transformer可以对JSON反序列化的对象进行自动转换和映射。同时也需要reflect-metadata提供运行时注解的能力,该第三方库直接import即可。

(1)在当前module下执行ohpm install命令安装所需的依赖:

ohpm install class-transformer
ohpm install reflect-metadata

(2)修改 /utils/JSONTools.ets 代码如下:

// Developer Beta2版本后Type类型会与SDK中的Type类型冲突导致编译报错,此处需要重命名
import { Type as JsonType, plainToClass } from 'class-transformer';
import "reflect-metadata";
import { JSON } from '@kit.ArkTS';

export namespace JSONTools {
  const albumJson =
    '{"id": 1, "name": "test", "photos": [{"id": 11, "name": "kkk.png"}, {"id": 112, "name": "fff.txt"}]}'

  // 相册类,包含一个Photo数组类型的成员
  class Album {
    id?: number;
    name?: string;
    // 自定义类型的成员需要添加装饰器进行映射才能正常转换
    @JsonType(() => Photo)
    photos: Photo[] = [];
  }

  // 照片类
  class Photo {
    id?: number;
    name?: string;

    getPhotoName(): string | undefined {
      return this.name
    }
  }

  export function getPhotoFiles(): string[] {
    // 通过JSON.parse进行反序列化,再用plainToClass进行类型转换
    let album = plainToClass(Album, JSON.parse(albumJson) as Album)
    if (album && album.photos && album.photos.length > 0) {
      // 通过map操作获取photos数组中每个对象的name属性
      return album.photos.flatMap(photo => photo.getPhotoName()!)
    }
    return []
  }
}

【总结】

在ArkTS中进行JSON反序列化时,数据类型的信息会丢失,这导致解析后的对象无法调用其方法。

仅使用JSON.parse无法实现类型的自动映射,但可以通过引入第三方库来实现自动转换和映射类型。通过引入class-transformer和reflect-metadata等第三方库,可以实现JSON解析后自动类型映射,确保反序列化后的对象能够调用其方法。

更多关于HarmonyOS鸿蒙Next中接口请求成功后赋值报错的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你是想把请求的结果解析成你自定义的类吧,可以使用 JSON.parse 方法

鸿蒙Next中接口请求成功后赋值报错通常由数据类型不匹配或空指针引起。检查赋值操作两侧的数据类型是否一致,确保接口返回的数据结构符合预期。使用TypeScript类型注解可减少类型错误。确认异步操作已完成再进行赋值,避免在数据未返回时操作变量。调试时可使用console.log输出数据内容辅助排查。

在赋值时,resp.result 返回的是字符串类型,需要先进行 JSON 解析才能映射到 tits 类。修改如下:

let newsResult: tits = JSON.parse(resp.result);

确保接口返回的数据结构与 tits 类定义一致,特别是 data 字段应为 Userinfo[] 数组。如果字段不匹配,会导致解析失败。

回到顶部