HarmonyOS 对于json字符串转具体类对象的方案(反序列化操作)

​在网络请求中,需要涉及到返回json字符串报文,转具体类对象的这种问题,请问一下有什么好用的库或者功能,能够实现 str转具体类的obj的这种方式嘛。

比如我一个string 如下:​

{ 
  "code":0, 
"message":"success", 
"data":{//这里的data是泛型 
  "username":"oven" 
} 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

想要转成 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());
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
分享
微博
QQ
微信
回复
2024-11-18 16:19:14


相关问题
JSON反序列化,如何重命名字段?
827浏览 • 1回复 待解决
如何将JSON字符串Class对象
869浏览 • 1回复 待解决
如何将JSON字符串Class对象数组?
969浏览 • 1回复 待解决
如何实现MapJSON字符串
1654浏览 • 1回复 待解决
HarmonyOS http请求,json序列化
763浏览 • 1回复 待解决
如何打印JSON对象JSON字符串
872浏览 • 1回复 待解决
HarmonyOS JSONmap结构如何序列化
1219浏览 • 1回复 待解决
如何将对象转为JSON字符串
1008浏览 • 1回复 待解决
求大佬告知如何序列化对象
1571浏览 • 1回复 待解决
HarmonyOS 字符串图片
602浏览 • 1回复 待解决
HarmonyOS ASCII字符串
530浏览 • 1回复 待解决
自定义如何实现序列化
2533浏览 • 1回复 待解决
ArrayBuffer怎样字符串
902浏览 • 1回复 待解决