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
【背景知识】
[@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[]
数组。如果字段不匹配,会导致解析失败。