json 如何转换成自定义的业务类对象

json 如何转换成自定义的业务类对象

HarmonyOS
2024-06-03 21:50:32
795浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
Heiang

ArkTS中已禁用Object.assign,其他禁用的接口可以查看参考文档可以通过反射的Reflect.set(target, propertyName, value)这个方法对基础类型的对象属性进行遍历赋值。基于此实现把json字符串转为自定义类对象,可参考Demo

示例代码

// 属性填充器接口定义转换属性填充器接口 
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 { 
  } 
} 
 
//接上一条定义工具类,主要实现属性值类型的区分赋值 
 
// 工具类 
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(TAG, "not support [" + key + "] type: " + typeof value) 
      } 
    }) 
  } 
} 
 
//定义Bean类 
 
export class TestA extends PropertyFillerImpl { 
  name?: string 
  size?: number 
  isTest?: boolean 
  testB?: TestB 
  testC?: TestC 
  testD?: TestD[] 
 
  fillObjectProperties(key: string, value: Record<string, Object>) { 
    if (key === "testB") { 
      this.testB = new TestB(value) 
    } else if (key === "testC") { 
      this.testC = new TestC(value) 
    } else { 
    } 
  } 
 
  fillArrayProperties(key: string, value: Object[]) { 
    if (key === "testD") { 
      this.testD = value.map((item: Object): TestD => new TestD(item as Record<string, Object>)) 
    } else { 
    } 
  } 
} 
 
 
class TestB extends PropertyFillerImpl { 
  a?: string 
  b?: number 
} 
 
class TestC extends PropertyFillerImpl { 
  a?: string 
  b?: number 
  d?: TestD 
 
  getDe(): boolean { 
    return this.d.e 
  } 
 
  fillObjectProperties(key: string, value: Record<string, Object>) { 
    if (key === "d") { 
      this.d = new TestD(value) 
    } 
  } 
} 
 
class TestD extends PropertyFillerImpl { 
  e?: boolean 
  f?: string 
} 
 
//业务中使用代码 
 
let jsonString: string = ` 
{ 
"isTest": true, 
"name": "name value", 
"size": 15, 
"testB": { 
"a": "bbbbbbbbbbbaaaaaa" 
}, 
"testC": { 
"a": "caa", 
"b": 111, 
"d": { 
"e": false, 
"f": "ffffff" 
} 
}, 
"testD": [ 
{ 
"e": true, 
"f": "dddddddd" 
}, 
{ 
"e": false, 
"f": "dddddddd2" 
} 
] 
} 
` 
let testA = new TestA(JSON.parse(jsonString)) 
console.log("testA", JSON.stringify(testA))
  • 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.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.

参考链接

限制使用标准库

分享
微博
QQ
微信
回复
2024-06-04 21:26:06
相关问题
HarmonyOS json转换成对象
983浏览 • 2回复 待解决
Map类型怎么转换成Json string
3093浏览 • 1回复 待解决
HarmonyOS将对象转换成字符串方法
1615浏览 • 1回复 待解决
HarmonyOS 日期如何转换成毫秒
743浏览 • 1回复 待解决
HarmonyOS 图片转换成ImageBitmap
1030浏览 • 1回复 待解决
HarmonyOS 页面转换成图片
575浏览 • 1回复 待解决
HarmonyOS 如何将汉字转换成拼音
984浏览 • 1回复 待解决
如何base64转换成图片?
11554浏览 • 2回复 待解决
如何将AndroidAPP转换成鸿蒙
355浏览 • 1回复 已解决
HarmonyOS Object怎么转换成map
725浏览 • 1回复 待解决
HarmonyOS 网络图片如何转换成PixelMap
724浏览 • 1回复 待解决
json字符串与自定义class结构转换
2857浏览 • 1回复 待解决
如何将文件转换成字符串
1136浏览 • 1回复 待解决
如何将某个时间转换成距现在时间
1247浏览 • 1回复 待解决