HarmonyOS 鸿蒙Next中这里的json字符串怎么转成自定义model啊?求教

HarmonyOS 鸿蒙Next中这里的json字符串怎么转成自定义model啊?求教

public campList(params: string, callBack: Function) {
  let tb = new taskBse();
  this.post(params, this.ApiCampHomeList,(data:http.HttpResponse)=>{
    let items: Array<mapUserCampModel> = json.parse(data.result.toString()) as Array<mapUserCampModel>;

    items.forEach(item=>{
      let j = item.campNewModel as campModel;
      item.campNewModel = json.parse(jsonObj);
    })

    if(items)
    {
      callBack(items);
      return;
    }
    callBack(null);
  })
}

image

================================================

我这里其实是json字符串格式。。。 怎么才能转成自定义model


更多关于HarmonyOS 鸿蒙Next中这里的json字符串怎么转成自定义model啊?求教的实战教程也可以访问 https://www.itying.com/category-93-b0.html

11 回复

【解决方案】

开发者您好,实现字符串和json对象互转、实体对象和json对象间互转有两种解决方案:

  • 使用系统提供的API处理转换:
@Entry
@Component
export struct TestMain {
  build() {
    Column() {
      Button('Test')
        .onClick(() => {
          this.test();
        })
    }
  }

  test() {
    try {
      let jsonStr = '{"app_tlive_yxt_pattern_yyyyMMddHHmm" : "yyyy年MM月dd日 HH:mm", "id" : 123}';
      // json字串转Record对象
      let jsonObj :Record<string,string> = JSON.parse(jsonStr) as Record<string,string>;
      let appTlive = jsonObj['app_tlive_yxt_pattern_yyyyMMddHHmm'];
      // 对象转json字串
      let jsonStr1 = JSON.stringify(jsonObj);

      // json字串转实体对象
      let jsonObj2 :DateInfo = JSON.parse(jsonStr) as DateInfo;
      let appTlive2 = jsonObj2.app_tlive_yxt_pattern_yyyyMMddHHmm;
      let id = jsonObj2.id;

      // 实体对象转json字串
      let jsonStr3 = JSON.stringify(jsonObj2);
    } catch (error) {
      console.error('Error parsing JSON:', error);
    }
  }
}

export class DateInfo {
  app_tlive_yxt_pattern_yyyyMMddHHmm: string ='';
  id?: number;
}
  • 使用三方库ef_json处理转换:
    如果需要json其他专业领域的处理(比如json5解析、bigint相关json转换、eftool类似的JSON封装包等),可以借助OpenHarmony三方库中心仓中已有的工具包处理:【中心仓链接】ef_json三方库中心仓地址】

  • 下面是使用已有的三方库处理字符串、实体对象和json对象(JSONObjectJSONArray)间互转:在项目的oh-package.json5里面添加ef_json库引用,然后直接使用,示例如下:

// 在项目的oh-package.json5里面,添加ef_json的依赖
 "dependencies": {
    "[@yunkss](/user/yunkss)/ef_json": '1.0.2'
  }
import {JSONArray, JSONObject} from '[@yunkss](/user/yunkss)/ef_json'

@Entry
@Component
export struct TestMain {
  build() {
    Column() {
      Button('TEST')
        .onClick(() => {
          this.test();
        })
    }
  }

  test() {
    let userList = new Array<User>();
    let u1 = new User();
    u1.code = '2345';
    u1.name = '测试用户1';
    userList.push(u1);

    let person = new Person();
    person.id = 123;
    person.user = u1;
    person.userList = userList;
    // 将实体对象转json字符串
    let jsonStr = JSONObject.toJSONString(person);
    // 将json字符串转回jsonObject对象
    let jsonObj1 = JSONObject.parse(jsonStr);
    // 将实体对象直接转成jsonObject对象
    let jsonObj2 = JSONObject.from<Person>(person);
    // 将实体对象集合转换成json字符串
    let jsonStr2 = JSONArray.toJSONString(userList);
    // 将json字符串转回jsonArray对象
    let jsonArr = JSONArray.parse(jsonStr2);
    // 将实体对象集合转换成jsonArray对象
    let jsonArr2 = JSONArray.from(userList);
  }
}

export class User {
  code: string ='';
  name: string ='';
}

export class Person {
  code: string ='';
  name: string ='';
  user?: User;
  userList?: User[];
}

【背景知识】

  • json格式规范:
    首先,需要了解json的语法规范,它通常包括以下几种基本结构:

    • 对象(Object):由键值对组成,eg:{"name": "Alice", "age":30};
    • 数组(Array):由一系列值组成,eg:["Alice", "Bob", "Charlie"];
    • 值(Value):可以是字符串、数字、布尔值、null、对象或数组等。
  • json转换原理:
    jsonN对象转换为字符串的过程是一个从数据结构到文本的转换过程。它依赖于对JSON格式的准确理解和序列化算法的实现。
    序列化算法通过遍历数据结构、处理基本类型、递归处理嵌套结构、拼接字符串以及错误处理等步骤,将JSON对象转换为一个符合JSON格式的字符串。

  • String.prototype.replace(pattern, replacement)replace()方法返回一个新字符串,其中一个、多个或所有匹配的pattern被替换为replacementpattern可以是字符串或RegExpreplacement可以是字符串或一个在每次匹配时调用的函数。如果pattern是字符串,则只会替换第一个匹配项。需要注意的是该方法并不改变调用它的字符串本身,而是返回一个新的字符串。

  • 控制字符:
    控制字符是ASCII字符集中的非打印字符,用于控制设备(如打印机)的操作或提供其他信息。这些字符通常是不可见的,但它们可能会影响文本的显示和处理。常见的控制字符包括:
    换行符(\n)
    回车符(\r)
    制表符(\t)
    退格(\b)
    等等…

更多关于HarmonyOS 鸿蒙Next中这里的json字符串怎么转成自定义model啊?求教的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


不行 后来发现是json里面带了转义符 才转失败的。包括论坛里面一下第三方库 plainToClass,plainToInstance都不行。 我从新写了一个没有转义符的api给专门给鸿蒙用。这个api原来在object-c里面给ios调用都是可以转成功的。可能鸿蒙的一些转对象功能太弱了。碰见转义符的就转不成功。

图片

这里的campNewModel是字符串 不是对象 我也不知道为什么这里对象没有转成功。。。

那你试试这样写: let trans = json.parse(item.campNewModel) as campModel

不行 后来发现是json里面带了转义符 才转失败的。包括论坛里面一下第三方库 plainToClass,plainToInstance都不行。 我从新写了一个没有转义符的api给专门给鸿蒙用。这个api原来在object-c里面给ios调用都是可以转成功的。可能鸿蒙的一些转对象功能太弱了。碰见转义符的就转不成功。

json.parse(jsonObj) as campModel

这样试试?

let j = item.campNewModel as campModel;
item.campNewModel = json.parse(j) as campModel;

不行
Argument of type ‘campModel’ is not assignable to parameter of type ‘string’. <ArkTSCheck>

第一行代码已经把 j 以一个对象的形式取出来了,你为啥还要把它转一下格式再赋值给这个item.campNewModel ?

"这个地方它是字符串 不是对象 我传递了图片 你刷新看看就知道了 我也不知道为什么这里是字符串json不是对象。。。。"

在HarmonyOS Next中,使用JSON.parseObject()方法将JSON字符串转换为自定义Model。首先定义Model类,使用@SerializedName注解标注字段与JSON键的映射关系。例如:

class UserModel {
  @SerializedName('user_name')
  name: string = '';

  @SerializedName('user_age')
  age: number = 0;
}

const jsonStr = '{"user_name":"张三","user_age":25}';
const user: UserModel = JSON.parseObject(jsonStr, UserModel);

该方法直接完成反序列化,自动填充对应字段值。

在HarmonyOS Next中,推荐使用JSON.parse()配合类型断言或JSON.stringify()进行JSON字符串与自定义Model的转换。从你的代码看,json.parse(data.result.toString()) as Array<mapUserCampModel>的用法是正确的,但需要注意确保JSON结构与Model属性完全匹配。

针对嵌套对象campNewModel的转换问题,建议:

  1. 明确定义campModel接口/类,包含所有必需的属性
  2. 直接解析整个响应数据:
let response = JSON.parse(data.result.toString()) as { campNewModel: string }[];
let items = response.map(item => ({
  ...item,
  campNewModel: JSON.parse(item.campNewModel) as campModel
}));

如果遇到属性不匹配,可在Model类中实现自定义的fromJson静态方法处理字段映射。确保Model属性均为可选或提供默认值,以兼容JSON中可能缺失的字段。

回到顶部