JSON 持久化存储笔记(Unity)

1. JSON 简介

JSON(JavaScript Object Notation)是一种轻量级数据交换格式,易于读写,适合存储和传输结构化数据。
在 Unity 中,常用的 JSON 解析库有:

  • JsonUtility(Unity 内置)
  • LitJson(第三方库,需导入)

2. JsonUtility vs LitJson

特性JsonUtilityLitJson
来源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(更强大,但需导入)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值