ˊˊ
👨💻个人主页:@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏:Unity基础实战
⭐🅰️⭐
文章目录
- ⭐🅰️⭐
- ⭐前言⭐
- 🎶(==1==)持久数据文件夹
- 🎶(==2==)JsonUtlity进行序列化
- 🪶<font color=red>0. jsonUtilty的注意点(缺点)
- 🪶1.将对象序列化成字符串(Json格式)
- 🪶2.将Json反序列化成对象
- 🪶3.练习(将序列化和反序列化变成方法调用)
- 🎶(==3==)LitJson进行序列化
- 🪶1.如何使用
- 🪶<font color=red>2. LitJson的注意点
- 🪶3.序列化
- 🪶4.反序列化
- 🪶5.练习
- 🎶(==4==)JsonUtility和LitJson的区别ˊ---
- 🎶(==5==)Json管理器---
- ⭐缺点 ⭐
⭐前言⭐
🎶(1)持久数据文件夹
- 先获取文件夹的位置
print(Application.persistentDataPath);
- 1.存储字符串到指定路径文件中
File.WriteAllText(Application.persistentDataPath + “/text.json”,“这是我创建的新json脚本” );
- 2.在指定路径文件中读取字符串
string str = File.ReadAllText(Application.persistentDataPath + “/Test.json”);
🎶(2)JsonUtlity进行序列化
JsonUtility是Unity引擎中的一个工具类,用于将JSON字符串转换为Unity对象或将Unity对象转换为JSON字符串。它可以方便地在Unity游戏中进行JSON数据的序列化和反序列化,使开发者可以更轻松地处理JSON数据。JsonUtility是一个非常强大和实用的工具,可以被广泛应用于Unity游戏中的数据管理、网络通信、游戏存档等方面。
- 现实作用:
1.将对象序列化成Json格式
2.将Json格式反序列化为对象
- 引用 using System.IO
IO通常是指Input/Output(输入/输出)的缩写。在计算机中,IO是指数据在计算机内部和外部设备之间的传输和交换。例如,键盘和鼠标输入数据到计算机中,打印机、屏幕和音箱从计算机中输出数据。这种数据的输入和输出过程就是IO。
🪶0. jsonUtilty的注意点(缺点)
😶🌫️注意:
1.float序列化时看起来会有一些误差2.被包裹的自定义类需要加上序列化特性[System.Serializable]3.想要序列化私有变量 需要加上特性[SerializeField]4.JsonUtility不支持字典5.JsonUtlity存储null对象不会是null 而是默认值的数据,比如空int 会变成06.JsonUtility无法直接反序列化读取数据集合"[]",需要用一个对象包裹它7.文本编码格式需要时UTF-8 不然无法加载
🪶1.将对象序列化成字符串(Json格式)
-
string jsonStr = JsonUtility.ToJson( dataGame );
// DataGame 是类对象
-
File.WriteAllText(Application.persistentDataPath + “/text1.json”, jsonStr);
//将序列化后的字符串数据存在文件夹中
🪶2.将Json反序列化成对象
-
jsonStr = File.ReadAllText(Application.persistentDataPath + “/text1.json”);
//读取文件中的字符串
-
DataGame dataGame = JsonUtility.FromJson< DataGame >(jsonStr);
//使用Json字符串内容 转换成类对象
-
代码
jsonStr = File.ReadAllText(Application.persistentDataPath + "/text1.json");DataGame dataGame = JsonUtility.FromJson<DataGame >(jsonStr);
🪶3.练习(将序列化和反序列化变成方法调用)
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;[System.Serializable]
public class Item
{public int id;public int num;public Item( int ID,int NUM){id = ID;num = NUM;}
}public class BossInfo
{public string name;public int attack;public int defence;public float moveSpeed;public double roundSpeed;public Item weapon;public List<int> listInt;public List<Item> itemList;public Dictionary<int, Item> itemDic1;public Dictionary<string, Item> itemDic2;[SerializeField ]private int self = 2 ;[SerializeField]protected int pro = 3; //序列化public void serilized(BossInfo obj){if(obj!=null ){string onjInfo = JsonUtility.ToJson(obj);File.WriteAllText(Application.persistentDataPath + ("/BossInfo.json"), onjInfo);}}//反序列化public BossInfo RevSerilized(string path){if (path != null){string objInfo = File.ReadAllText(Application.persistentDataPath +"/"+ path);return JsonUtility.FromJson<BossInfo>(objInfo);}else return null;}
}public class text : MonoBehaviour
{private void Start(){BossInfo boss = new BossInfo();boss.name = "鸭嘴兽";boss.attack = 100;boss.defence = 20;boss.moveSpeed = 50;boss.roundSpeed = 30;boss.weapon = new Item(001, 10);boss.listInt = new List<int>() { 1, 2, 3, 4 };boss.itemList = new List<Item>() { new Item(002, 10), new Item(003, 10) };boss.itemDic1 = new Dictionary<int, Item>() { { 1, new Item(002, 10) }, { 2, new Item(003, 10) } };boss.itemDic2 = new Dictionary<string, Item>() { { "鸭子1", new Item(003, 10) }, { "鸭子2", new Item(004, 10) } };boss.serilized(boss); //JsonUyility 不支持字典print(Application.persistentDataPath);boss.RevSerilized("BossInfo.json");}
}
🎶(3)LitJson进行序列化
LitJson是一个用于C#和Unity的Json解析器和生成器。它可以将Json格式的数据解析为C#对象,也可以将C#对象序列化为Json格式的数据。它具有高效,易用和可扩展性的特点,在游戏开发、网站开发、物联网等领域广泛应用。
它是一个第三方库是第三方编写的(而UtilityJson是自己编写的),用于处理Json的序列化和反序列化,LitJson是C#编写的,体积小、速度快、易于使用
🪶1.如何使用
- 在官网中跳转GitHub获取最新版本
- 将下好的版本中的C#脚本拖到Unity中
🪶2. LitJson的注意点
- 1.序列化不需要加特性
- 2.不能序列化私有变量
- 3.需要引用命名空间
- 4.可以保存null值
- 5.可以序列化字典,但是键必须是字符串类型否则会报错
- 6.序列化类的时候一定要确保它有无参构造函数否则会报错
- 7.可以直接读取数据集合[]
- 8.文本编码格式需要时UTF-8 不然无法加载
🪶3.序列化
-
和方式JsonUtility一样
-
string jsonStr = JsonMapper.ToJson(obj);
// obj是类对象
-
File.WriteAllText(Application.persistentDataPath + “/text.json”, jsonStr);
//将序列化后的字符串数据存在文件夹中
🪶4.反序列化
-
jsonStr = File.ReadAllText(Application.persistentDataPath + “/text.json”);
-
①objInfo 2 = JsonMapper.ToObject< objInfo> (jsonStr);
//通过泛型转换更方便
-
②JsonData data = JsonMapper.ToObject(jsonStr);
//JsonData是LitJson提供的类对象访问其中的内容要用键值对的形式去print(data["age"]);
🪶5.练习
using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class Item
{public int id;public int num;public Item() { } //因为有参把他替换了所以需要重新声明public Item( int ID,int NUM){id = ID;num = NUM;}
}public class BossInfo
{public string name;public int attack;public int defence;public float moveSpeed;public double roundSpeed;public Item weapon;public List<int> listInt;public List<Item> itemList;public Dictionary<int, Item> itemDic1;public Dictionary<string, Item> itemDic2;private int self = 2 ;protected int pro = 3; //LitJson序列化public void LSerilized(BossInfo obj){if (obj != null){string objInfo = JsonMapper.ToJson(obj);File.WriteAllText(Application.persistentDataPath + ("/BossInfo2"), objInfo);}}//LitJson反序列化public BossInfo RevLSerilized(string path){if(path != null ){string objInfo = File.ReadAllText(Application.persistentDataPath +"/"+path );return JsonMapper.ToObject<BossInfo>(objInfo);}else return null;}
}public class text : MonoBehaviour
{private void Start(){BossInfo boss = new BossInfo();boss.name = "鸭嘴兽";boss.attack = 100;boss.defence = 20;boss.moveSpeed = 50;boss.roundSpeed = 30;boss.weapon = new Item(001, 10);boss.listInt = new List<int>() { 1, 2, 3, 4 };boss.itemList = new List<Item>() { new Item(002, 10), new Item(003, 10) };boss.itemDic1 = new Dictionary<int, Item>() { { 1, new Item(002, 10) }, { 2, new Item(003, 10) } };boss.itemDic2 = new Dictionary<string, Item>() { { "鸭子1", new Item(003, 10) }, { "鸭子2", new Item(004, 10) } };boss.LSerilized(boss); //JsonUyility 不支持字典print(Application.persistentDataPath);boss.RevLSerilized("BossInfo.json");}
}
🎶(4)JsonUtility和LitJson的区别ˊ—
- 1.JsonUt1ity是Unity自带,LitJson是第三方需要引用命名空间
- 2.JsonUt1ity使用时自定义类需要加特性,LitJson不需要
- 3.JsonUt1ity支持私有变量(加特性),LitJson不支持
- 4.JsonUt1ity不支持字典,LitJson支持(但是键只能是字符串)
- 5.JsonUt1ity不能直接将数据反序列化为数据集合(数组字典),LitJson可以
- 6.JsonUt1ity对自定义类不要求有无参构造,LitJson需要
- 7.JsonUt1ity存储空对象时会存储默认值而不是nu11,LitJson会存null
🎶(5)Json管理器—
using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;/// <summary>
/// 序列化和反序列化Json时 使用的是哪种方案
/// </summary>
public enum JsonType
{JsonUtlity,LitJson,
}/// <summary>
/// Json数据管理类 主要用于进行 Json的序列化存储到硬盘 和 反序列化从硬盘中读取到内存中
/// </summary>
public class JsonMgr
{private static JsonMgr instance = new JsonMgr();public static JsonMgr Instance => instance;private JsonMgr() { }public void SaveData(object data, string fileName, JsonType type = JsonType.LitJson){string path = Application.persistentDataPath + "/" + fileName + ".json";string jsonStr = "";switch (type){case JsonType.JsonUtlity:jsonStr = JsonUtility.ToJson(data);break;case JsonType.LitJson:jsonStr = JsonMapper.ToJson(data);break;}File.WriteAllText(path, jsonStr);}/// <summary>/// Json反序列化/// </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(){//先判断 是否存在streamingAssets中string path = Application.streamingAssetsPath + "/" + fileName + ".json";//如果不存在默认文件 就从 persistentDataPath文件夹中去寻找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.JsonUtlity:data = JsonUtility.FromJson<T>(jsonStr);break;case JsonType.LitJson:data = JsonMapper.ToObject<T>(jsonStr);break;}//把对象返回出去return data;}
}
⭐缺点 ⭐
- 重复工作繁多,自定义数据类,需要自己取实现存储读取的功能而且代码的相似度极高
- 数据容易被修改,只要找到文件位置,就可以轻易的进行数据修改
⭐【Unityc#专题篇】之c#进阶篇】
⭐【Unityc#专题篇】之c#核心篇】
⭐【Unityc#专题篇】之c#基础篇】
⭐【Unity-c#专题篇】之c#入门篇】
⭐【Unityc#专题篇】—进阶章题单实践练习
⭐【Unityc#专题篇】—基础章题单实践练习
⭐【Unityc#专题篇】—核心章题单实践练习
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、