解释
JsonMgr
是一个用于管理 JSON 数据的工具类,负责将数据对象序列化为 JSON 格式并存储到硬盘中,同时支持从硬盘读取 JSON 文件并反序列化为对象。它支持两种不同的 JSON 序列化方式:Unity
的内置 JsonUtility
和第三方库 LitJson
。
核心功能概述:
- 存储 JSON 数据:将对象序列化为 JSON 字符串,并存储到硬盘的指定文件中。
- 读取 JSON 数据:从指定文件中读取 JSON 数据,并将其反序列化为对象。
- 支持不同的 JSON 序列化方式:支持通过
JsonType
参数选择使用JsonUtility
或LitJson
进行序列化和反序列化。
构造函数
JsonMgr()
:这是一个私有构造函数,确保类遵循单例模式。
公有方法解释:
-
SaveData(object data, string fileName, JsonType type = JsonType.LitJson)
- 用于将指定的
data
对象序列化为 JSON 字符串,并将其保存到persistentDataPath
中的指定文件。你可以选择使用JsonUtility
或LitJson
序列化方案。 - 参数解释:
data
:要保存的数据对象。fileName
:保存文件的名称。type
:可选参数,默认使用LitJson
,也可以使用JsonUtility
。
- 用于将指定的
-
LoadData<T>(string fileName, JsonType type = JsonType.LitJson)
- 用于从指定路径读取 JSON 文件并将其反序列化为类型
T
的对象。如果在streamingAssetsPath
或persistentDataPath
路径中找不到该文件,则返回一个新创建的对象。 - 参数解释:
fileName
:要读取的文件名。type
:可选参数,默认使用LitJson
进行反序列化,也可以选择使用JsonUtility
。
- 返回值:返回从 JSON 文件反序列化后的对象。
- 用于从指定路径读取 JSON 文件并将其反序列化为类型
示例用例:
我们可以通过这个 JsonMgr
来管理游戏中的存档数据。假设我们有一个玩家数据 PlayerInfo
类,我们希望在游戏中保存和加载玩家的进度。
using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;public class Item
{public int id;public int num;public Item() { }public Item(int id, int num){this.id = id;this.num = num;}
}public class PlayerInfo
{public string name;public int atk;public int def;public float moveSpeed;public double roundSpeed;public Item weapon;public List<int> listInt;public List<Item> itemList;public Dictionary<string, Item> itemDic2;
}
public class LitJsonTest : MonoBehaviour
{private void Start(){PlayerInfo player = new PlayerInfo();player.name = "曹旭阳";player.atk = 11;player.def = 5;player.moveSpeed = 1.5f;player.roundSpeed = 2.2f;player.weapon = new Item(1, 1);player.listInt = new List<int>() { 1, 2, 3, 4, 5 };player.itemList = new List<Item>() { new Item(2, 2), new Item(3, 3) };player.itemDic2 = new Dictionary<string, Item>() { { "1", new Item(6, 6) }, { "2", new Item(7, 7) } };//SaveData("LitJsonCao", player);//PlayerInfo player2 = LoadData("LitJsonCao");JsonMgr.Instance.SaveData(player, "CaoJson");PlayerInfo player2 = JsonMgr.Instance.LoadData<PlayerInfo>("CaoJson");Debug.Log(Application.persistentDataPath);Debug.Log(player2.name);}public void SaveData(string path,PlayerInfo player){string jsonStr = JsonMapper.ToJson(player);print(Application.persistentDataPath);File.WriteAllText(Application.persistentDataPath + "/" + path + ".json", jsonStr);}public PlayerInfo LoadData(string path){string jsonStr = File.ReadAllText(Application.persistentDataPath + "/" + path + ".json");PlayerInfo jsonInfo = JsonMapper.ToObject<PlayerInfo>(jsonStr);return jsonInfo;}}
流程说明:
-
创建玩家数据:
- 创建一个玩家数据对象
PlayerInfo
,其中包含玩家的姓名、等级和分数。
- 创建一个玩家数据对象
-
保存玩家数据:
- 调用
SaveData()
方法,将玩家数据序列化为 JSON,并存储到文件中。默认使用LitJson
进行序列化。文件名为PlayerSaveData.json
。
- 调用
-
加载玩家数据:
- 调用
LoadData()
方法,从文件CaoJson.json
中读取玩家数据,并将其反序列化为player2
对象。此时使用LitJson
进行反序列化。
- 调用
-
使用
JsonUtility
序列化和反序列化:- 可以选择使用
JsonUtility
来保存和加载数据,这里保存到文件默认的LitJson
,并从中读取玩家数据。
- 可以选择使用
注:
使用JsonUtlity可以序列化/反序列化构造函数,但是想要序列化内部类和私有字段分别需要加[System.Serializable]和[SerializeField]特性。LitJson不会序列化和反序列化构造函数和私有字段,但是LitJson序列化和反序列化内部类不需要加特性。
JsonUtlity不支持序列化字典。JsonLit支持序列化字典