文章配图: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))

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐