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);
})
}

================================================
我这里其实是json字符串格式。。。 怎么才能转成自定义model
更多关于HarmonyOS 鸿蒙Next中这里的json字符串怎么转成自定义model啊?求教的实战教程也可以访问 https://www.itying.com/category-93-b0.html
【解决方案】
开发者您好,实现字符串和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对象(JSONObject、JSONArray)间互转:在项目的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被替换为replacement。pattern可以是字符串或RegExp,replacement可以是字符串或一个在每次匹配时调用的函数。如果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的转换问题,建议:
- 明确定义
campModel接口/类,包含所有必需的属性 - 直接解析整个响应数据:
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中可能缺失的字段。

