HarmonyOS 对于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类的对象, 所以, 先请问一下有没有好的实现方案呢?

HarmonyOS
2024-11-18 09:07:19
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
aquaa

​提供一个demo供参考:

demo:​

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());
分享
微博
QQ
微信
回复
2024-11-18 16:19:14
相关问题
如何将JSON字符串Class对象
467浏览 • 1回复 待解决
JSON反序列化,如何重命名字段?
246浏览 • 1回复 待解决
如何将JSON字符串Class对象数组?
483浏览 • 1回复 待解决
如何实现MapJSON字符串
1129浏览 • 1回复 待解决
如何打印JSON对象JSON字符串
370浏览 • 1回复 待解决
HarmonyOS http请求,json序列化
56浏览 • 1回复 待解决
如何将对象转为JSON字符串
563浏览 • 1回复 待解决
HarmonyOS 字符串图片
41浏览 • 1回复 待解决
HarmonyOS JSONmap结构如何序列化
552浏览 • 1回复 待解决
求大佬告知如何序列化对象
725浏览 • 1回复 待解决
ArrayBuffer怎样字符串
523浏览 • 1回复 待解决
自定义如何实现序列化
1988浏览 • 1回复 待解决
HarmonyOS 如何解析json字符串
537浏览 • 1回复 待解决