HarmonyOS应用开发实战:猫猫大作战-JSON 序列化与反序列化
·


前言
JSON 是 ArkTS 中最常用的数据交换格式。在「猫猫大作战」中,JSON 用于游戏数据持久化(保存到文件)、网络请求数据传输(与后端通信)、以及深拷贝对象。
本文讲解 JSON.stringify 和 JSON.parse 的完整用法。
一、序列化 JSON.stringify
const gameData = {
score: 2450,
highScore: 5000,
cats: [
{ id: 'cat_1', level: 3, x: 2, y: 5 },
{ id: 'cat_2', level: 1, x: 4, y: 3 },
],
gameTime: 180,
};
const jsonStr = JSON.stringify(gameData);
console.info(jsonStr);
// {"score":2450,"highScore":5000,"cats":[...],"gameTime":180}
// 格式化输出(可读性好)
const prettyJson = JSON.stringify(gameData, null, 2);
二、反序列化 JSON.parse
async function loadGameFromFile(path: string): Promise<GameData | null> {
try {
const file = fileIo.openSync(path, fileIo.OpenMode.READ_ONLY);
const stat = fileIo.statSync(path);
const buf = new ArrayBuffer(stat.size);
fileIo.readSync(file.fd, buf);
fileIo.closeSync(file);
const text = new TextDecoder().decode(buf);
const data = JSON.parse(text) as GameData;
return data;
} catch (err) {
console.error(`读取游戏数据失败: ${err.message}`);
return null;
}
}
三、JSON 方法对比
| 方法 | 功能 | 返回值 | 异常 |
|---|---|---|---|
stringify(obj) | 对象 → JSON 字符串 | string | 循环引用会抛异常 |
parse(json) | JSON 字符串 → 对象 | any | 格式错误会抛异常 |
stringify(obj, null, 2) | 格式化输出 | string | 同上 |
四、深拷贝对象
// 使用 JSON 实现对象的深拷贝
const original = { score: 100, combo: { count: 3, multiplier: 3 } };
const copy = JSON.parse(JSON.stringify(original));
copy.score = 200;
copy.combo.count = 5;
console.info(original.score); // 100 ✅ 原对象不受影响
console.info(original.combo.count); // 3 ✅ 嵌套对象也不受影响
五、常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| JSON.parse 抛异常 | 字符串格式不正确 | try-catch 包裹 |
| JSON.stringify 抛异常 | 存在循环引用 | 删除循环引用或用自定义 replacer |
| undefined 属性丢失 | JSON.stringify 忽略 undefined | 先用默认值替换 |
// 安全解析
function safeParse<T>(json: string, defaultVal: T): T {
try {
return JSON.parse(json) as T;
} catch {
return defaultVal; // 解析失败返回默认值
}
}
总结
JSON 是 ArkTS 中对象序列化和反序列化的标准方式,用于数据持久化和深拷贝。核心要点:stringify 序列化、 parse 反序列化、 try-catch 防解析异常、 深拷贝用 JSON.parse(JSON.stringify(obj))。
如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!
相关资源:
更多推荐



所有评论(0)