HarmonyOS 鸿蒙Next 对于json字符串转具体类对象的方案(反序列化操作)
HarmonyOS 鸿蒙Next 对于json字符串转具体类对象的方案(反序列化操作)
在网络请求中,需要涉及到返回json字符串报文, 转具体类对象的这种问题, 请问一下有什么好用的库或者功能, 能够实现 str转具体类的obj的这种方式嘛. 比如我一个string 如下 { “code”:0, “message”:“success”, “data”:{//这里的data是泛型 “username”:“oven” } } 想要转成 Response<UserBean>这种类的对象, 之前有试过JSON.parse的方式, 但是通过这种方式处理的对象, 即使用as强转成了Response<UserBean> 这个类, 但是调用Reponse的方法时会报Error message:is not callable的错, 导致app崩溃, 后来了解了一下 通过JSON.parse 转换的对象实际上是javascript的object对象, 即使用了as关键字他也不是Reponse类的对象, 所以, 先请问一下有没有好的实现方案呢?
2 回复
export class Objects {
/**
把data中的属性赋值给target对象中的数据
@param target
@param data
*/
static fillProperties<T extends PropertyFiller>(target: T, data: Record<string, Object>): void {
if (target === undefined || target === null || data === undefined || data === null) {
// 如果target或者data为空,则不赋值
return
}
if (typeof target !== 'object') {
// 如果target不是对象类型,不允许赋值
return
}
Object.keys(data).forEach((key: string): void => {
let value: Object = data[key]
if (typeof value === 'string') {
Reflect.set(target, key, value as string)
} else if (typeof value === 'boolean') {
Reflect.set(target, key, value as boolean)
} else if (typeof value === 'number') {
Reflect.set(target, key, value as number)
} else if (typeof value === 'object') {
if (Array.isArray(value)) {
// 如果value是数组,则调用填充数组属性的方法
target.fillArrayProperties(key, value as Object[])
} else {
// 如果value是object,则调用填充object属性的方法
target.fillObjectProperties(key, value as Record<string, Object>)
}
} else {
console.log("Test not support [" + key + "] type: " + typeof value)
}
})
} }
export interface PropertyFiller {
/**
填充object类型的属性
@param key 属性名称
@param value 属性值
*/
fillObjectProperties(key: string, value: Record<string, Object>): void
/**
填充数组类型的属性
@param key 属性名
@param value 属性值
*/
fillArrayProperties(key: string, value: Object[]): void }
// 属性填充器接口抽象实现类,定义入参构造函数并调用初始化属性方法;接口空实现,子类按需实现
export abstract class PropertyFillerImpl implements PropertyFiller {
/**
构造函数
@param value json对象型入参
*/
constructor(value?: Record<string, Object>) {
if (value !== undefined && value !== null) {
// 如果入参有值,则调用工具类填充属性值
Objects.fillProperties(this, value)
}
}
fillObjectProperties(key: string, value: Record<string, Object>): void {
}
fillArrayProperties(key: string, value: Object[]): void {
}
}
class TestAdModel extends PropertyFillerImpl{
name?:string
public test():string{
return "string"
} }
export class Response extends PropertyFillerImpl{
code?:string
message?:string
data?:TestAdModel
test():string{
return "string"
}
fillObjectProperties(key: string, value: Record<string, Object>){
if (key === "data") {
this.data = new TestAdModel(value) as TestAdModel
}
}
}
let model :TestAdModel = new TestAdModel();
model.name = "test"
let response:Response = new Response()
response.code = "0"
response.message = "success"
response.data = model
let responseStr:string = JSON.stringify(response);
let response2:Response = new Response(JSON.parse(responseStr))
if(response2.data !== undefined) {
console.log(response2.data.test());
console.log(response2.data.name); }
console.log(response2.test());
在HarmonyOS鸿蒙Next中,JSON字符串转具体类对象的操作(即反序列化)通常可以通过使用JSON解析库来实现。常用的JSON解析库包括Fastjson、Gson和Jackson等,尽管具体支持情况可能因HarmonyOS版本和生态而异,但基本原理是相通的。
以下是一个基于假设的通用方案:
-
引入JSON库:首先,确保你的项目中已经引入了合适的JSON解析库。这通常通过项目依赖管理工具(如Maven、Gradle)来完成。
-
定义目标类:创建一个与JSON结构相对应的Java类,确保字段名称和类型与JSON中的键和值匹配。
-
解析JSON字符串:使用JSON库提供的API,将JSON字符串解析为目标类的实例。这通常涉及创建一个JSON解析器实例,并调用其解析方法,传入JSON字符串和目标类的Class对象。
-
处理异常:在解析过程中,务必捕获并处理可能发生的异常,如格式错误、类型不匹配等。
请注意,由于HarmonyOS的特性和限制,某些JSON库可能需要适配或存在特定的使用方法。如果上述方案在你的环境中无法直接应用,建议查阅HarmonyOS官方文档或相关开发社区获取更具体的指导。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html