HarmonyOS 鸿蒙Next 在使用class-transformer时遇到的问题,有人遇到过吗?

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

HarmonyOS 鸿蒙Next 在使用class-transformer时遇到的问题,有人遇到过吗?

转换超级简单的一个JSON串,得到的对象值是undefined,有人知道什么原因吗?

cke_1599.png

import { classToPlain, plainToClass, plainToClassFromExist } from ‘class-transformer’;
class User {
id: number = 0;
firstName: string = “”;
lastName: string = “”;
age: number = 0;
getName() {
return this.firstName + ’ ’ + this.lastName;
}
isAdult() {
return this.age > 36 && this.age < 60;
}
}

======================

userJson:string = ‘{“id”: 1,“firstName”: “Johny”,“lastName”: “Cage”,“age”: 27}’;

aboutToAppear(): void {
hilog.info(0xFF00,“AAA”,“aboutToAppear”);
//this.requestData()
let users = plainToClass(User, this.userJson);
hilog.info(0xFF00,“AAA”,“users:”+ users.lastName);

const defaultUser = new User();
let mixedUser = plainToClassFromExist(defaultUser, this.userJson);
hilog.info(0xFF00,“AAA”,“mixedUser:”+ mixedUser.firstName);
}

15 回复

第二个参数是json对象。

import { classToPlain ,plainToClass,plainToClassFromExist} from 'class-transformer'

class User{ id:number = 0 firstName : string = “” lastName :string = “” age:number =0 getName(){ return this.firstName + ’ ’ + this.lastName }

isAdult(){ return this.age > 36 && this.age < 60 } }

@Entry @Component struct Page043 { userJson:string = {<span class="hljs-string"><span class="hljs-string">"id"</span></span>:<span class="hljs-number"><span class="hljs-number">1</span></span>,<span class="hljs-string"><span class="hljs-string">"firstName"</span></span>:<span class="hljs-string"><span class="hljs-string">"Johny"</span></span>,<span class="hljs-string"><span class="hljs-string">"lastName"</span></span>:<span class="hljs-string"><span class="hljs-string">"Cage"</span></span>,<span class="hljs-string"><span class="hljs-string">"age"</span></span>:<span class="hljs-number"><span class="hljs-number">27</span></span>} build() { Column() { Button(‘测试’).onClick(()=>{ let users_2 :User= plainToClassFromExist(new User,JSON.parse(this.userJson)) console.info(users_2.firstName:${users_2.firstName}) console.info(users_2.getName:${users_2.getName()}) console.info(users_2.isAdult:${users_2.isAdult()})

    <span class="hljs-keyword"><span class="hljs-keyword">let</span></span> users:User = plainToClass(User,<span class="hljs-built_in"><span class="hljs-built_in">JSON</span></span>.parse(<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.userJson))
    console.info(`users.firstName:${users.firstName}`)
    console.info(`users.getName:${users.getName()}`)
    console.info(`users.isAdult:${users.isAdult()}`)
  })
}
.width(<span class="hljs-string"><span class="hljs-string">'100%'</span></span>)
.height(<span class="hljs-string"><span class="hljs-string">'100%'</span></span>)

} }<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

打印

app Log: users_2.firstName:Johny
app Log: users_2.getName:Johny Cage
app Log: users_2.isAdult:false
app Log: users.firstName:Johny
app Log: users.getName:Johny Cage
app Log: users.isAdult:false<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

感谢并采纳大牛的解答,我再试试eftool这个第三方库。

使用eftool,更新属性的值,数据变化,ui不会变化

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

欢迎使用eftool,里面有JSONObject,JSONArray等方法可以将json与对象,数组,map等互转

实测eftool只能解析属性,方法会丢失。也就是下面的代码会走到catch里。 import { JSONObject } from ‘@yunkss/eftool’ class User{ id:number = 0 firstName : string = “” lastName :string = “” age:number =0 getName(){ return this.firstName + ’ ’ + this.lastName }

isAdult(){ return this.age > 36 && this.age < 60 } }

@Entry @Component struct Page045 { userJson:string = {"id":1,"firstName":"Johny","lastName":"Cage","age":27} build() { Column() { Button(‘测试’).onClick(()=>{ let myUser:User = JSONObject.parseObject<User>(this.userJson) console.info(myUser.firstName:${myUser.firstName}) try{ console.info(myUser.getName:${myUser.getName()}) }catch (e){ console.info(‘e’,JSON.stringify(e)) } try{ console.info(myUser.isAdult:${myUser.isAdult()}) }catch (e){ console.info(‘e’,JSON.stringify(e)) }

  })
}
.width('100%')
.height('100%')

} }

对的,目前只解析了属性, 感谢提出宝贵意见,我将会考虑优化方法

请教下被有遇到被‘[@Observed](/user/Observed)’修饰的对象无法解析的问题不

手动组装一下吧
@Observed是作用在class上的,服务端的数据经过处理解析成class,不好说对应的@Observed是否还存在,之前直接解析,连属性和方法都会丢失的。
参考:https://developer.huawei.com/consumer/cn/forum/topic/0204149169544358375?fid=0109140870620153026

请问解决了吗。使用eftool,数据变化,ui不会更新

class-transformer可以解决这个问题,但是 https://ohpm.openharmony.cn/已经找不到,怕后续更新用不了

建议直接系统的JSON

let t: T = JSON.parse('your json string')

你写的这个我没用过,我看你的json数据和Data class都问题的,你用系统JSON试试咯,大概率你使用的库不完全兼容ets

在使用HarmonyOS 鸿蒙Next的class-transformer时,若遇到问题,可能是由于依赖版本不兼容、类定义不当或转换方法使用错误等原因。请确保已正确安装并导入了class-transformerreflect-metadata库,且类定义中使用了正确的装饰器。此外,检查JSON数据结构是否与类属性匹配,使用plainToClassplainToInstance等方法时确保传入正确的参数。如果问题依旧没法解决,请加我微信,我的微信是itying888。

回到顶部