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

发布于 1周前 作者 yibo5220 来自 鸿蒙OS

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版本和生态而异,但基本原理是相通的。

以下是一个基于假设的通用方案:

  1. 引入JSON库:首先,确保你的项目中已经引入了合适的JSON解析库。这通常通过项目依赖管理工具(如Maven、Gradle)来完成。

  2. 定义目标类:创建一个与JSON结构相对应的Java类,确保字段名称和类型与JSON中的键和值匹配。

  3. 解析JSON字符串:使用JSON库提供的API,将JSON字符串解析为目标类的实例。这通常涉及创建一个JSON解析器实例,并调用其解析方法,传入JSON字符串和目标类的Class对象。

  4. 处理异常:在解析过程中,务必捕获并处理可能发生的异常,如格式错误、类型不匹配等。

请注意,由于HarmonyOS的特性和限制,某些JSON库可能需要适配或存在特定的使用方法。如果上述方案在你的环境中无法直接应用,建议查阅HarmonyOS官方文档或相关开发社区获取更具体的指导。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部