1. JSON 简介
JSON(JavaScript Object Notation)是一种轻量级数据交换格式,易于读写,适合存储和传输结构化数据。
在 Unity 中,常用的 JSON 解析库有:
JsonUtility
(Unity 内置)LitJson
(第三方库,需导入)
2. JsonUtility vs LitJson
特性 | JsonUtility | LitJson |
---|---|---|
来源 | Unity 内置 | 第三方库(需导入) |
性能 | 较高(Unity 优化) | 较低(反射开销) |
功能 | 较简单(仅支持公有字段) | 更强大(支持属性、私有字段等) |
泛型支持 | 有限(需显式类型) | 完整(直接 ToObject<T> ) |
格式化 | 无(紧凑输出) | 可格式化(缩进、换行) |
推荐场景 | 简单数据存储、Unity 序列化 | 复杂 JSON、跨平台数据交换 |
3. 基本用法
(1) JsonUtility(Unity 内置)
// 序列化(对象 → JSON 字符串)
string jsonStr = JsonUtility.ToJson(myObject);
// 反序列化(JSON 字符串 → 对象)
MyClass obj = JsonUtility.FromJson<MyClass>(jsonStr);
特点:
- 仅支持
[Serializable]
标记的类。 - 不处理私有字段、属性(除非标记
[SerializeField]
)。
(2) LitJson(需导入)
// 序列化(对象 → JSON 字符串)
string jsonStr = JsonMapper.ToJson(myObject);
// 反序列化(JSON 字符串 → 对象)
MyClass obj = JsonMapper.ToObject<MyClass>(jsonStr);
特点:
- 支持私有字段、属性、字典等复杂结构。
- 可格式化输出(
JsonWriter
设置缩进)。
4. 存储与读取 JSON 文件
(1) 存储路径
Application.persistentDataPath
- 持久化目录(各平台不同,数据卸载后仍存在)。
- 适合存档、配置等需要长期存储的数据。
Application.streamingAssetsPath
- 只读目录(打包后不能修改)。
- 适合初始配置、资源加载。
(2) 示例代码
using UnityEngine;
using System.IO;
public static class JsonStorage
{
// 存储 JSON
public static void SaveJson<T>(T data, string fileName, bool useLitJson = false)
{
string path = Path.Combine(Application.persistentDataPath, fileName + ".json");
string json = useLitJson ?
LitJson.JsonMapper.ToJson(data) :
JsonUtility.ToJson(data);
File.WriteAllText(path, json);
}
// 读取 JSON
public static T LoadJson<T>(string fileName, bool useLitJson = false)
{
string path = Path.Combine(Application.persistentDataPath, fileName + ".json");
if (!File.Exists(path)) return default(T);
string jsonStr = File.ReadAllText(path);
return useLitJson ?
LitJson.JsonMapper.ToObject<T>(jsonStr) :
JsonUtility.FromJson<T>(jsonStr);
}
}
5. 使用建议
JsonUtility 适用场景
- 简单数据存储(如玩家位置、基础配置)。
- 需要高性能(如频繁序列化/反序列化)。
- 仅需处理公有字段。
LitJson 适用场景
- 复杂数据结构(如嵌套类、字典、私有字段)。
- 需要格式化 JSON(如调试、人工可读)。
- 跨平台数据交换(如与后端 API 交互)。
6. 常见问题
(1) JsonUtility 不支持属性?
- 是的,需改用字段或
[SerializeField]
。
(2) LitJson 报 “AOT 错误”?
- 在 IL2CPP 平台(如 iOS),需预生成 AOT 代码(或换用
JsonUtility
)。
(3) 如何美化 JSON 输出?
- LitJson:
JsonWriter writer = new JsonWriter { PrettyPrint = true }; JsonMapper.ToJson(myObject, writer);
7. 总结
需求 | 推荐方案 |
---|---|
简单、高性能 | JsonUtility |
复杂结构、灵活 | LitJson |
跨平台、API 交互 | LitJson (或 Newtonsoft.Json ) |
根据项目需求选择合适的库,一般优先用 JsonUtility
,复杂需求再用 LitJson
。
🚀 进阶建议:
- 加密敏感 JSON 数据(如
AES
加密)。 - 使用
[System.Serializable]
确保兼容性。 - 考虑
Newtonsoft.Json
(更强大,但需导入)。