Unity数据持久化3——Json

概述

基础知识

Json文件格式

Json基本语法

练习

可以搜索:Json在线,复制代码进去解析是否写错了。

Excel转Json

C#读取存储Json文件

JsonUtility

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;[System.Serializable]
public class Student
{public int age;public string name;public Student(int age, string name){this.age = age;this.name = name;}
}public class Player
{public string name;public int age;public bool sex;public float testF;public double testD;public int[] ids;public List<int> ids2;public Dictionary<int, string> dic;public Dictionary<string, string> dic2;public Student s1;public List<Student> s2s;[SerializeField]private int privateI = 1;[SerializeField]protected int protectedI = 2;
}public class RoleData
{public List<RoleInfo> list;
}[System.Serializable]
public class RoleInfo
{public int hp;public int speed;public int volume;public string resName;public int scale;
}public class Lesson1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){#region 知识点一 JsonUtility是什么//JsonUtility 是Unity自带的用于解析Json的公共类//它可以//1.将内存中对象序列化为Json格式的字符串//2.将Json字符串反序列化为类对象#endregion#region 知识点二 必备知识点——在文件中存读字符串//1.存储字符串到指定路径文件中//第一个参数 填写的是 存储的路径//第二个参数 填写的是 存储的字符串内容//注意:第一个参数 必须是存在的文件路径 如果没有对应文件夹 会报错File.WriteAllText(Application.persistentDataPath + "/Test.json", "Sunset存储的json文件");print(Application.persistentDataPath);//2.在指定路径文件中读取字符串string str = File.ReadAllText(Application.persistentDataPath + "/Test.json");print(str);#endregion#region 知识点三 使用JsonUtility进行序列化//序列化:把内存中的数据 存储到硬盘上//方法://JsonUtility.ToJson(对象)Player p = new Player();p.name = "Sunset";p.age = 18;p.sex = true;p.testF = 1.5f;p.testD = 2.2;p.ids = new int[] { 1, 2, 3, 4, 5 };p.ids2 = new List<int>() { 1, 2, 3 };p.dic = new Dictionary<int, string>() { { 1, "123" }, { 2, "234" } };p.dic2 = new Dictionary<string, string> { { "3", "345" }, { "4", "456" } };p.s1 = null; //new Student(16, "Jack");p.s2s = new List<Student> { new Student(17, "Mary"), new Student(20, "Tom") };//JsonUtility提供了现成的方法 可以把类对象 序列化为 Json字符串string jsonStr = JsonUtility.ToJson(p);File.WriteAllText(Application.persistentDataPath + "/Player.json", jsonStr);//注意://1.float序列化时看起来会有一些误差//2.自定义类需要加上序列化特性[System.Serializable]//3.想要序列化私有变量 需要加上特性[SerializeField]//4.JsonUtility不支持字典//5.IsonUtility存储null对象不会是null 而是默认值的数据#endregion#region 知识点四 使用JsonUtility进行反序列化//反序列化:把硬盘上的数据 读取到内存中//方法://JsonUtility.FromJson(字符串)//读取文件中的 Json字符串jsonStr = File.ReadAllText(Application.persistentDataPath + "/Player.json");//使用Json字符串内容 转换成类对象Player p2 = JsonUtility.FromJson(jsonStr, typeof(Player)) as Player; //这种写法比较少用Player p3 = JsonUtility.FromJson<Player>(jsonStr); //这个写法常用//注意://如果Json中数据少了,读取到内存中类对象中时不会报错#endregion#region 知识点五 注意事项//1.JsonUtilitu无法直接读取数据集合jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/RoleInfo2.json");print(jsonStr);//List<RoleInfo> roleInfoList = JsonUtility.FromJson<List<RoleInfo>>(jsonStr);RoleData data = JsonUtility.FromJson<RoleData>(jsonStr);//2.文件编码格式需要是 UTF-8 不然无法加载#endregion#region 总结//1.必备知识点 —— File存读字符串的方法 ReadAllText 和 WriteAllText//2.JsonUtility提供的序列化、反序列化方法 ToJson 和 FromJson//3.自定义类需要加上序列化特性 [System.Serializable]//4.私有保护成员 需要加上 [SerializeField]//5.JsonUtility 不支持字典//6.JsonUtility 不能直接将数据反序列化为数据集合//7.Json文档编码格式必须是 UTF-8#endregion}// Update is called once per framevoid Update(){}
}

练习:

LitJson

using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;public class Item2
{public int id;public int num;//LitJson反序列化时 自定义类型需要无参构造public Item2() { }public Item2(int id, int num){this.id = id;this.num = num;}
}public class PlayerInfo2
{public string name;public int atk;public int def;public float moveSpeed;public double roundSpeed;public Item2 weapon; public List<int> listInt;public List<Item2> itemList;//public Dictionary<int, Item2> itemDic;public Dictionary<string, Item2> itemDic2;
}public class Lesson2_Test : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){PlayerInfo2 p = new PlayerInfo2();p.name = "Sunstet";p.atk = 10;p.def = 3;p.moveSpeed = 20;p.roundSpeed = 20;p.weapon = new Item2(1, 10);p.listInt = new List<int>() { 1, 2, 3, 4, 5 };p.itemList = new List<Item2>() { new Item2(2, 20), new Item2(3, 30) };//p.itemDic = new Dictionary<int, Item2>() { { 1, new Item2(4, 40) }, { 2, new Item2(5, 50) } };p.itemDic2 = new Dictionary<string, Item2> { { "3", new Item2(6, 60) }, { "4", new Item2(7, 70) } };SaveData(p, "PlayerInfo2");PlayerInfo2 p2 = LoadData("PlayerInfo2");}public void SaveData(PlayerInfo2 p, string path){string jsonStr = JsonMapper.ToJson(p);File.WriteAllText(Application.persistentDataPath + "/" + path + ".json", jsonStr);print(Application.persistentDataPath);}public PlayerInfo2 LoadData(string path){string jsonSr = File.ReadAllText(Application.persistentDataPath + "/" + path + ".json");return JsonMapper.ToObject<PlayerInfo2>(jsonSr);}
}

JsonUtility 和 LitJson对比

总结

实践项目

需求分析 + Json数据管理类创建

存储和读取数据

using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;/// <summary>
/// 序列化和反序列化Json时 使用的是哪种方案
/// </summary>
public enum JsonType
{JsonUtility,LitJson,
}/// <summary>
/// Json数据管理类 主要用于进行 Json的序列化存储到硬盘 和 反序列化从硬盘中读取到内存中
/// </summary>
public class JsonMgr 
{private static JsonMgr instance = new JsonMgr();public static JsonMgr Instance => instance;public JsonMgr() { }//存储Json数据 序列化public void SaveData(object data, string fileName, JsonType type = JsonType.LitJson){#region 自己写//string jsonStr = "";//switch (type)//{//    case JsonType.JsonUtility://        jsonStr = JsonUtility.ToJson(data);//        break;//    case JsonType.LitJson://        jsonStr = JsonMapper.ToJson(data);//        break;//}//File.WriteAllText(Application.persistentDataPath + "/" + fileName + ".json", jsonStr);#endregion//确定存储路径string path = Application.persistentDataPath + "/" + fileName + ".json";//序列化 得到Json字符串string jsonStr = "";switch (type){case JsonType.JsonUtility:jsonStr = JsonUtility.ToJson(data);break;case JsonType.LitJson:jsonStr = JsonMapper.ToJson(data);break;}//把序列化的Json字符串 存储到指定路径的文件中File.WriteAllText(path, jsonStr);}/// <summary>/// 读取指定文件中的数据 反序列化/// </summary>/// <typeparam name="T"></typeparam>/// <param name="fileName"></param>/// <param name="type"></param>/// <returns></returns>public T LoadData<T>(string fileName, JsonType type = JsonType.LitJson) where T : new(){//确定从哪个路径读取//首先先判断 默认数据文件夹中是否有我们想要的数据 如果有 就从中获取string path = Application.streamingAssetsPath + "/" + fileName + ".json";//先判断 是否重载这个文件//如果不存在默认文件 就从 读写文件夹中去寻找if (!File.Exists(path))path = Application.persistentDataPath + "/" + fileName + ".json";//如果读写文件夹中都还没有 那就返回一个默认对象if (!File.Exists(path))return new T();//进行反序列化string jsonStr = File.ReadAllText(path);//把对象返回出去//数据对象T data = default(T);switch (type){case JsonType.JsonUtility:data = JsonUtility.FromJson<T>(jsonStr);break;case JsonType.LitJson:data = JsonMapper.ToObject<T>(jsonStr);break;}return data;}}

生成资源包

挖坑总结

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

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

相关文章

AI周报(6.23-6.29)

AI应用-巴西医生成功用Vision Pro做手术 巴西外科医生布鲁诺戈巴托&#xff08;Bruno Gobbato&#xff09;在2024年4月22日首次成功使用Apple Vision Pro进行了肩袖撕裂的手术。这次手术采用了肩关节镜技术&#xff0c;通过关节内的摄像头捕捉图像&#xff0c;并通过高分辨率的…

基于Spring Boot的校园失物招领系统

1 项目介绍 1.1 研究的背景及意义 在网络时代飞速发展的今天&#xff0c;随着网络技术日臻完善&#xff0c;我们的生活方式正经历深刻变革。在物质追求日益增长的同时&#xff0c;提升个人精神境界也成为了现代人的共同向往&#xff0c;而阅读则是滋养心灵、丰富精神世界的重…

PyScript:在浏览器中释放Python的强大

PyScript&#xff1a;Python代码&#xff0c;直接在网页上运行。- 精选真开源&#xff0c;释放新价值。 概览 PyScript是一个创新的框架&#xff0c;它打破了传统编程环境的界限&#xff0c;允许开发者直接在浏览器中使用Python语言来创建丰富的网络应用。结合了HTML界面、Pyo…

WLAN 4-Way Handshake如何生成GTK?

关于Wi-Fi的加密认证过程&#xff0c;可以参考如下链接&#xff0c;今天我们来理解如何生成GTK。 WLAN数据加密机制_tls加密wifi-CSDN博客 1 GTK GTK&#xff08;Group Temporal Key&#xff09;是由AP通过GMK生成&#xff0c;长度为128位&#xff0c;并在四次握手的第三步中…

使用Netty框架实现WebSocket服务端与客户端通信(附ssl)

仓库地址&#xff1a; https://gitee.com/lfw1024/netty-websocket 导入后可直接运行 预览页面 自签证书&#xff1a; #换成自己的本地ip keytool -genkey -alias server -keyalg RSA -validity 3650 -keystore D:\mystore.jks -ext sanip:192.168.3.7,ip:127.0.0.1,dns:lo…

【STM32修改串口波特率】

STM32微控制器中的串口波特率调整通常涉及到USART&#xff08;通用同步接收器/发送器&#xff09;模块的配置。USART模块提供了多个寄存器来设置波特率&#xff0c;其中关键的寄存器包括BRR&#xff08;波特率寄存器&#xff09;和USART_CR1&#xff08;控制寄存器1&#xff09…

【云原生】加强理解Pod资源控制器

Pod控制器 文章目录 Pod控制器一、Replication Controller&#xff08;RC&#xff09;1.1、什么是RC1.2、RC应用1.3、RC滚动更新 二、Replication Set&#xff08;RS&#xff09;2.1、什么是RS2.2、RS应用 三、Deployment3.1、什么是Deployment3.2、更新节奏和更新逻辑3.3、自定…

uniapp - 微信小程序 - 自定义底部tabbar

废话不多说&#xff0c;直接行源码 这里需要的底部tabbar的图片在这里 我的资源里面呢 图片是这样的 先看成品吧 首先 - BaseApp\components\Tabbar.vue <script setup>import {ref,nextTick,watch} from "vue"// 核心 - 隐藏uniapp自带的底部tabbaruni.hi…

【机器学习】基于层次的聚类方法:理论与实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 基于层次的聚类方法&#xff1a;理论与实践引言1. 层次聚类基础1.1 概述1.2 距离…

python-斐波那契数列

[题目描述] 斐波那契数列是指这样的数列&#xff1a;数列的第一个和第二个数都为 1&#xff0c;接下来每个数都等于前面 2个数之和。 给出一个正整数 a&#xff0c;要求斐波那契数列中第 a 个数是多少。输入&#xff1a; 第 1 行是测试数据的组数 n&#xff0c;后面跟着 n 行输…

【密码学】面向小白的古典密码基础入门笔记

目录 Mindmap 前言 破译方法 三类古典密码 替换密码 分类 单表替换密码 凯撒密码 简单替换密码 仿射密码 普莱费尔密码 培根密码 猪圈密码 摩斯密码 多表替换密码 维吉尼亚密码 移位密码 滚筒密码 栅栏密码 Mindmap 前言 1.所有古典密码都已不安全 2.密…

Github忘记了Two-factor Authentication code

意外重置了edge浏览器 码农家园github自从开启开启了2FA认证&#xff0c;每次输入auth code确实麻烦&#xff0c;于是下载了浏览器插件 Open two factor authenticator&#xff0c; 最近edge频繁宕机&#xff0c;而且提示磁盘空间不足&#xff0c;要不要立即清理并重置浏览器临…

【python】socket通信代码解析

目录 一、socket通信原理 1.1 服务器端 1.2 客户端 二、socket通信主要应用场景 2.1 简单的服务器和客户端通信 2.2 并发服务器 2.3 UDP通信 2.4 文件传输 2.5 HTTP服务器 2.6 邮件发送与接收 2.7 FTP客户端 2.8 P2P文件共享 2.9 网络游戏 三、python中Socket编…

Mathematica训练课(45)-- 一些常用的函数Abs[],Max[]等函数用法

①绝对值函数&#xff1a;Abs[]函数 ②最大值和最小值函数 ③反函数

微信小程序服务器从腾讯云迁移到阿里云出现的坑

微信小程序服务器从腾讯云迁移到阿里云出现的坑 背景 原先小程序后台服务器到期&#xff0c;因为之前买的是腾讯云新用户&#xff0c;便宜&#xff0c;到期后续费金额懂的都懂。就在阿里云用新用户买了个新的&#xff0c;遂把服务全转到了阿里云服务器上。 此时&#xff0c;域…

Spring Boot结合FFmpeg实现视频会议系统视频流处理与优化

在构建高效稳定的视频会议系统时,实时视频流的处理和优化是开发者面临的核心挑战之一。这不仅仅是简单的视频数据传输,更涉及到一系列复杂的技术问题,需要我们深入分析和有效解决。 高并发与实时性要求: 视频会议系统通常需要支持多人同时进行视频通话,这就意味着系统需要…

基于SpringBoot网吧管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; Java精品实战案例《600套》 2025-2026年最值得选择的Java毕业设计选题大全&#xff1…

python基础语法 003-4 数据类型集合

1 集合 1.1 什么是集合 什么是集合&#xff1f;ANS:集合set是一个无序的不重复元素序列集合怎么表示&#xff1f;ANS: {} , 用逗号隔开打印元组类型&#xff0c;type()一个元素的集合怎么表示&#xff1f;&#xff1a;ANS:存储多种类型{"a", 1} """…

Spring Cloud Gateway3.x自定义Spring Cloud Loadbalancer负载均衡策略以及实现动态负载均衡策略的方案

目录 前言 1.原理分析 1.1 ReactiveLoadBalancerClientFilter源码分析 1.2 LoadBalancerClientFactory源码分析 2.代码实现 2.1 扩展原生RoundRobinLoadBalancer轮询策略 2.1.1 自定义实现RoundRobinLoadBalancer 2.1.2 配置自定义的RoundRobinLoadBalan…

【Python实战因果推断】7_元学习器2

目录 X-Learner X-Learner X-learner 在解释上要比前一个学习器复杂得多&#xff0c;但其实现却非常简单&#xff0c;所以如果你一开始不理解&#xff0c;也不用担心。X 学习器有两个阶段和一个倾向得分模型。第一个阶段与 T 学习器相同。首先&#xff0c;将样本分为治疗组和…