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;而阅读则是滋养心灵、丰富精神世界的重…

信息检索(57):MINIMIZING FLOPS TO LEARN EFFICIENT SPARSE REPRESENTATIONS

MINIMIZING FLOPS TO LEARN EFFICIENT SPARSE REPRESENTATIONS 摘要1 引言2 相关工作3 预期 FLOPS 次数4 我们的方法5 实验6 结论 发布时间&#xff08;2020&#xff09; 最小化 Flop 来学习高效的稀疏表示 摘要 1&#xff09;学习高维稀疏表示 2&#xff09;FLOP 集成到损失…

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 距离…

ArrayList练习

练习1&#xff1a;添加字符串和整数并进行遍历 1、add方法向集合中添加元素&#xff1b; 2、get方法获取集合中的元素。 public class ArrayListDemo1 {public static void main(String[] args) {ArrayList<String> list new ArrayList<>();list.add("aaa…

python-斐波那契数列

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

信息化建设中的安全底座:实施等保的法律依据与实际效益分析

随着信息技术的飞速发展&#xff0c;信息化建设已成为推动社会进步和经济发展的关键引擎。然而&#xff0c;伴随而来的是日益复杂多变的网络安全威胁&#xff0c;这对国家的安全、社会的稳定以及公众的利益构成了严峻挑战。在此背景下&#xff0c;信息安全等级保护&#xff08;…

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

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

【云原生】Kubernetes高级功能

Kubernetes高级功能 文章目录 Kubernetes高级功能资源列表基础环境一、ConfigMap1.1、什么是ConfigMap1.2、ConfigMap能解决哪些问题1.3、ConfigMap应用场景1.4、ConfigMap局限性1.5、ConfigMap的创建方法1.5.1、命令行直接创建1.5.2、通过文件创建1.5.3、指定目录创建1.5.4、编…

生成和查看预定义宏

参考下面的指令 arm-none-eabi-gcc -marcharmv7e-m -dM -E - < /dev/null | grep SYNC这个指令是用来生成和查看预定义宏&#xff08;macros&#xff09;的一种方法。让我们逐步分解和解释这个命令的各个部分&#xff1a; arm-none-eabi-gcc: 这是 ARM 架构下的交叉编译器…

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;域…