Json管理器的使用

news2024/10/26 3:19:34

解释

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支持序列化字典

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2223747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java程序员如何获得高并发经验?

高并发编程 提到并发编程很多人就会头疼了&#xff1b;首先就是一些基础概念&#xff1a;并发&#xff0c;并行&#xff0c;同步&#xff0c;异步&#xff0c;临界区&#xff0c;阻塞&#xff0c;非阻塞还有各种锁全都砸你脸上&#xff0c;随之而来的就是要保证程序运行时关键…

蓝桥杯题目理解

1. 一维差分 1.1. 小蓝的操作 1.1.1. 题目解析&#xff1a; 这道题提到了对于“区间”进行操作&#xff0c;而差分数列就是对于区间进行操作的好方法。 观察差分数列&#xff1a; 给定数列&#xff1a;1 3 5 2 7 1 差分数列&#xff1a;1 2 2 -3 5 6 题目要求把原数组全部…

Leetcode239. 滑动窗口最大值

问题描述&#xff1a; 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,…

c#子控件拖动父控件方法及父控件限在窗体内拖动

一、效果 拖放位置不超过窗体四边,超出后自动靠边停靠支持多子控件拖动指定控件拖放(含父控件或窗体)点击左上角logo弹出消息窗口(默认位置右下角)1.1 效果展示 1.2 关于MQTTnet(最新版v4.3.7.1207)实现在线客服功能,见下篇博文 https://github.com/dotnet/MQTTnet 网上…

7、哈希表

7、哈希表 哈希表最主要的作用就是把一个比较庞大的空间或者值域 映射到比较小的值域 (0-n) 就是将-10^9 ~10^9 映射到 0 ~10^5 一、存储结构 映射的方法可以是 h(x) x mod 10^5 但是这样映射会出现一个问题 可能会有重复的数字出现 所以就引出了两个方法 开放寻址法 和…

时间数据可视化基础实验(南丁格尔玫瑰图)——Python热狗大胃王比赛数据集

【实验名称】 实验一&#xff1a;时间数据的可视化 【实验目的】 1.掌握时间数据在大数据中的应用 2.掌握时间数据可视化图表表示 3. 利用python程序实现堆叠柱形图的可视化 【实验原理】 时间是一个非常重要的维度与属性。时间序列数据存在于社会的各个领域&#xff0c;如&a…

金融工程--pine-script 入门

背景 脚本基本组成 策略实现 实现马丁格尔策略 初始化变量&#xff1a;定义初始资本、初始头寸大小、止损百分比、止盈百分比以及当前资本和当前头寸大小等变量。 更新头寸&#xff1a;创建一个函数来更新头寸大小、止损价格和止盈价格。在马丁格尔策略中&#xff0c;每次亏…

若依框架篇-若依集成 X-File-Storage 框架(实现图片上传阿里云 OSS 服务器)、EasyExcel 框架(实现 Excel 数据批量导入功能)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 实现使用 Excel 文件批量导入 1.1 导入功能的前端具体实现 1.2 导入功能的后端具体实现 1.3 使用 EasyExcel 框架实现 Excel 读、写功能 1.4 将 Easy Excel 集成到…

npm、yarn、pnpm的workspaces使用

示例项目中总会遇到npm的packages中出现的workspaces键值对&#xff0c;自己的项目中没接触过这个东西&#xff0c;到底是什么&#xff1f;怎么用的&#xff1f;简单研究记录一下&#xff1a; abbrev是一个npm包&#xff0c;提供缩写展开功能。‌ 当你定义一个缩写后&#xff0…

mac电脑设置chrome浏览器语言切换为日语英语等不生效问题

在chrome中设置了语言&#xff0c;并且已经置顶了&#xff0c;但是不生效&#xff0c;在windows上直接有设置当前语言为chrome显示语言&#xff0c;但是mac上没有。 解决办法 在系统里面有一个单独给chrome设置语言的&#xff1a; 单独给它设定成指定的语言&#xff0c;然后重…

CTFHUB技能树之文件上传——双写后缀

开启靶场&#xff0c;打开链接&#xff1a; 直接指明是双写绕过方法 上传06shaungxie.php&#xff0c;内容如下&#xff1a; 这一步其实最好换成.png或者.jpg或者.gif这三个符合文件格式的要求后缀 用burp抓包改包&#xff1a; 将php改成pphphp后再“Forward”&#xff1a; 上传…

机房巡检机器人有哪些功能和作用

随着数据量的爆炸式增长和业务的不断拓展&#xff0c;数据中心面临诸多挑战。一方面&#xff0c;设备数量庞大且复杂&#xff0c;数据中心内服务器、存储设备、网络设备等遍布&#xff0c;这些设备需时刻保持良好运行状态&#xff0c;因为任何一个环节出现问题都可能带来严重后…

高边坡稳定安全监测预警系统解决方案

一、项目背景 高边坡的滑坡和崩塌是一种常见的自然地质灾害&#xff0c;一但发生而没有提前预告将给人民的生命财产和社会危害产生严重影响。对高边坡可能产生的灾害提前预警、必将有利于决策者采取应对措施、减少和降低灾害造成的损失。现有的高边坡监测技术有人工巡查和利用测…

设计一个html+css+js的注册页,对于注册信息进行合法性检测

综合使用HTML、JavaScript和CSS进行注册页面设计&#xff0c;实现以下若干功能&#xff1a; 注意整个页面的色调和美观使用FramesetTable布局&#xff08;div也可&#xff09;对用户ID和用户名、口令不符合条件及时判断对口令不一致进行及时判断&#xff08;34的及时判断&#…

【AI学习】Mamba学习(十三):简单了解S5模型,S5论文速读

学习了S4模型后&#xff0c;简单看一下S5模型。 来自两篇文章的摘要 苏神在文章《重温状态空间模型SSM&#xff1a;HiPPO的高效计算&#xff08;S4&#xff09;》中简单提到了S5模型&#xff1a; 由于 HiPPO 的推导是基于u(t)是一维函数进行的&#xff0c;所以到目前为止&am…

博弈论 C++

前置知识 若一个游戏满足&#xff1a; 由两名玩家交替行动在游戏进行的任意时刻&#xff0c;可以执行的合法行动与轮到哪位玩家无关不能行动的玩家判负 则称该游戏为一个公平组合游戏。 尼姆游戏&#xff08;NIM&#xff09;属于公平组合游戏&#xff0c;但常见的棋类游戏&…

揭开C++ STL的神秘面纱之string:提升编程效率的秘密武器

目录 &#x1f680;0.前言 &#x1f688;1.string 构造函数 &#x1f69d;1.1string构造函数 &#x1f69d;1.2string拷贝构造函数 &#x1f688;2.string类的使用 &#x1f69d;2.1.查询元素个数或空间 返回字符串中有效字符的个数&#xff1a;size lenth 返回字符串目…

micro-app【微前端实战】主应用 vue3 + vite 子应用 vue3+vite

micro-app 官方文档为 https://micro-zoe.github.io/micro-app/docs.html#/zh-cn/framework/vite 子应用 无需任何修改&#xff0c;直接启动子应用即可。 主应用 1. 安装微前端框架 microApp npm i micro-zoe/micro-app --save2. 导入并启用微前端框架 microApp src/main.ts …

2024软考网络工程师笔记 - 第8章.网络安全

文章目录 网络安全基础1️⃣网络安全威胁类型2️⃣网络攻击类型3️⃣安全目标与技术 &#x1f551;现代加密技术1️⃣私钥密码/对称密码体制2️⃣对称加密算法总结3️⃣公钥密码/非对称密码4️⃣混合密码5️⃣国产加密算法 - SM 系列6️⃣认证7️⃣基于公钥的认证 &#x1f552…

为微信小程序换皮肤之配置vant

微信小程序自带的控件虽然具有很好的通用性和简洁性&#xff0c;但在面对一些复杂的交互场景和个性化的设计需求时&#xff0c;可能会显得力不从心。其功能的相对基础使得开发者在实现诸如多步骤复杂表单提交、实时数据交互与可视化展示、高度定制化的界面布局等方面&#xff0…