Json管理器的使用

解释

JsonMgr 是一个用于管理 JSON 数据的工具类,负责将数据对象序列化为 JSON 格式并存储到硬盘中,同时支持从硬盘读取 JSON 文件并反序列化为对象。它支持两种不同的 JSON 序列化方式:Unity 的内置 JsonUtility 和第三方库 LitJson

核心功能概述:

  1. 存储 JSON 数据:将对象序列化为 JSON 字符串,并存储到硬盘的指定文件中。
  2. 读取 JSON 数据:从指定文件中读取 JSON 数据,并将其反序列化为对象。
  3. 支持不同的 JSON 序列化方式:支持通过 JsonType 参数选择使用 JsonUtilityLitJson 进行序列化和反序列化。

构造函数

  • JsonMgr():这是一个私有构造函数,确保类遵循单例模式。

公有方法解释:

  1. SaveData(object data, string fileName, JsonType type = JsonType.LitJson)

    • 用于将指定的 data 对象序列化为 JSON 字符串,并将其保存到 persistentDataPath 中的指定文件。你可以选择使用 JsonUtilityLitJson 序列化方案。
    • 参数解释:
      • data:要保存的数据对象。
      • fileName:保存文件的名称。
      • type:可选参数,默认使用 LitJson,也可以使用 JsonUtility
  2. LoadData<T>(string fileName, JsonType type = JsonType.LitJson)

    • 用于从指定路径读取 JSON 文件并将其反序列化为类型 T 的对象。如果在 streamingAssetsPathpersistentDataPath 路径中找不到该文件,则返回一个新创建的对象。
    • 参数解释:
      • fileName:要读取的文件名。
      • type:可选参数,默认使用 LitJson 进行反序列化,也可以选择使用 JsonUtility
    • 返回值:返回从 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;
    }

}

流程说明:

  1. 创建玩家数据

    • 创建一个玩家数据对象 PlayerInfo,其中包含玩家的姓名、等级和分数。
  2. 保存玩家数据

    • 调用 SaveData() 方法,将玩家数据序列化为 JSON,并存储到文件中。默认使用 LitJson 进行序列化。文件名为 PlayerSaveData.json
  3. 加载玩家数据

    • 调用 LoadData() 方法,从文件 CaoJson.json 中读取玩家数据,并将其反序列化为 player2 对象。此时使用 LitJson 进行反序列化。
  4. 使用 JsonUtility 序列化和反序列化

    • 可以选择使用 JsonUtility 来保存和加载数据,这里保存到文件 默认的LitJson,并从中读取玩家数据。

注:

使用JsonUtlity可以序列化/反序列化构造函数,但是想要序列化内部类和私有字段分别需要加[System.Serializable]和[SerializeField]特性。LitJson不会序列化和反序列化构造函数和私有字段,但是LitJson序列化和反序列化内部类不需要加特性。

JsonUtlity不支持序列化字典。JsonLit支持序列化字典

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值