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

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

HarmonyOS
2024-06-03 21:50:32
浏览
收藏 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))

参考链接

限制使用标准库

分享
微博
QQ
微信
回复
2024-06-04 21:26:06
相关问题
Map类型怎么转换成Json string
655浏览 • 1回复 待解决
json字符串与自定义class结构转换
654浏览 • 1回复 待解决
如何base64转换成图片?
8542浏览 • 2回复 待解决
请问如何将openblock文件转换成exe文件
1215浏览 • 0回复 待解决
自定义如何实现序列化
735浏览 • 1回复 待解决
getContext(this)能否在自定义中使用
1037浏览 • 1回复 待解决
自定义弹窗自定义转场动画
436浏览 • 1回复 待解决
ArkTs如何自定义容器组件?
1716浏览 • 1回复 待解决
自定义弹窗如何嵌套使用
498浏览 • 1回复 待解决
如何自定义组件原型菜单
455浏览 • 1回复 待解决
如何自定义模拟Tabs组件
411浏览 • 1回复 待解决