当前位置: 首页 > news >正文

Unity数据持久化之Json

Json概述

Json是什么?

全称:JavaScript对象简谱(JavaScript Object Notation)
Json是国际通用的一种轻量级的数据交换格式
主要在网络通讯中用于传输数据,或本地数据存储和读取
易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率
我们一般使用Json文件来记录和传输数据
Json文档就是使用Json格式配置填写的文档
后缀一般为.json
我们在游戏中可以把游戏数据按照Json的格式标准
存储在Json文档中,再将Json文档存储在硬盘上或者传输给远端
达到数据持久化或者数据传输的目的

Json文件格式

Json配置规则

用什么编辑Json文件?

只要能打开文档的软件都能打开Json文件
常用的一些编辑Json文件的方式
1、系统自带 – 记事本、写字板
2.通用文本编辑器 – Sublime Text等等
3.网页上的Json编辑器
注释

和C#中注释方式一致
1.双斜杠//注释内容
2.斜杠加星号/注释内容/
Json格式是一种键值对结构
在这里插入图片描述
语法规则
在这里插入图片描述
Json数据和类对象的对应关系
在这里插入图片描述
配置Json文档时的注意事项

1.如果数据表示对象那么最外层有大括号
2.一定是键值对形式
3.键一定是字符串格式
4.键值对用逗号分开
5.数组用[]包裹
6.对象用{}包裹

Excel转Json

Excel数据转Json数据

1.在百度或者Google搜索Excel转Json
2.选择在线转换的网站
比如:https://www.bejson.com/json/col2json/
3.进行转换
4.保存Json格式的数据

C#读取存储Json文件

JsonUtlity

JsonUtlity序列化

JsonUtlity是什么?
JsonUtlity 是Unity自带的用于解析Json的公共类
它可以
1.将内存中对象序列化为Json格式的字符串
2.将Json字符串反序列化为类对象

在文件中存读字符串
1、存储字符串到指定路径文件中
第一个参数:填写的是存储的路径(必须是存在的文件路径,如果没有对应文件夹会报错)
第二个参数:填写的是存储的字符串内容

File.WriteAllText(Application.persistentDataPath + "/Test.json","chx");

2、在指定路径文件中读取字符串

File.ReadAllText(Application.persistentDataPath + "/Test.json");

使用JsonUtlity进行序列化

[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 MrTang
{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;
}

序列化:把内存中的数据 存储到硬盘上
方法:
JsonUtility.ToJson(对象)
初始化数据

MrTang t = new MrTang();
t.name = "唐老狮";
t.age = 18;
t.sex = false;
t.testF = 1.4f;
t.testD = 1.4;t.ids = new int[] { 1, 2, 3, 4 };
t.ids2 = new List<int>() { 1, 2, 3 };
t.dic = new Dictionary<int, string>() { { 1, "123" }, { 2, "234" } };
t.dic2 = new Dictionary<string, string>() { { "1", "123" }, { "2", "234" } };t.s1 = null;//new Student(1, "小红");
t.s2s = new List<Student>() { new Student(2, "小明"), new Student(3, "小强") };

JsonUtility提供了现成的方法,可以把类对象序列化为Json字符串

string jsonStr = JsonUtility.ToJson(t);
File.WriteAllText(Application.persistentDataPath + "/MrTang.json",jsonStr);

注意:
1.float序列化时看起来会有一些误差
2.自定义类需要加上序列化特性[System.Serializable]
3.想要序列化私有变量 需要加上特性[SerializeField]
4.JsonUtility不支持字典
5.JsonUtlity存储null对象不会是null 而是默认值的数据

JsonUtility反序列化

使用JsonUtlity进行反序列化
反序列化:把硬盘上的数据 读取到内存中
方法:
JsonUtility.FromJson(字符串)

//读取文件中的Json字符串
jsonStr = File.ReadAllText(Application.persistentDataPath + "/MrTang.json");
//使用Json字符串内容转换成类对象
MrTang t2 = JsonUtility.FromJson(jsonStr,typeof(MrTang)) as MrTang;
MrTang t3 = JsonUtility.FromJson<MrTang>(jsonStr);

注意:
如果Json中数据少了,读取到内存中类对象中时不会报错
注意事项
1、JsonUtility无法直接读取数据集合
若想要读取,则将数据包裹到对象中,如下:
在这里插入图片描述

public class RoleData
{public List<RoleInfo> list;
}[System.Serializable]
3 个引用
public class RoleInfo
{public int hp;public int speed;public int volume;public string resName;public int scale;
}
RoleData data = JsonUtility.FromJson<RoleData>(jsonStr);

2、文本编码格式需要UTF-8,不然无法加载
总结
1.必备知识点 —— File存读字符串的方法 ReadAllText和WriteAllText
2.JsonUtlity提供的序列化反序列化方法 ToJson 和 FromJson
3.自定义类需要加上序列化特性[System.Serializable]
4.私有保护成员 需要加上[SerializeField]
5.JsonUtlity不支持字典
6.JsonUtlity不能直接将数据反序列化为数据集合
7.Json文档编码格式必须是UTF-8

LitJson

LitJson序列化

LitJson是什么?
它是一个第三方库,用于处理Json的序列化和反序列化
LitJson是c#编写的,体积小、速度快、易于使用
它可以很容易的嵌入到我们的代码中
只需要将LitJson代码拷贝到工程中即可
获取LitJson
1.前往LitJson官网
2.通过官网前往GitHub获取最新版本代码
3.将代码拷贝到Unity工程中 即可开始使用LitJson
在这里插入图片描述
使用LitJson进行序列化
方法:
JsonMapper.ToJson(对象)

public class Student2
{public int age;public string name;public Student2() { }public Student2(int age, string name){this.age = age;this.name = name;}
}public class MrTang2
{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 Student2 s1;public List<Student2> s2s;private int privateI = 1;protected int protectedI = 2;
}

初始化:

MrTang2 t = new MrTang2();
t.name = "唐老狮";
t.age = 18;
t.sex = true;
t.testF = 1.4f;
t.testD = 1.4;t.ids = new int[] { 1, 2, 3, 4 };
t.ids2 = new List<int>() { 1, 2, 3 };
//t.dic = new Dictionary<int, string>() { { 1, "123" }, { 2, "234" } };
t.dic2 = new Dictionary<string, string>() { { "1", "123" }, { "2", "234" } };t.s1 = null;//new Student(1, "小红");
t.s2s = new List<Student2>() { new Student2(2, "小明"), new Student2(3, "小强") };

序列化:

string jsonStr = JsonMapper.ToJson(t);
File.WriteAllText(Application.persistentDataPath + "/MrTang2.json",jsonStr);

注意:
1.相对JsonUtlity不需要加特性
2.不能序列化私有变量
3.支持字典类型,字典的键建议都是字符串,因为Json的特点,Json中的键会加上双引号。
4.需要引用LitJson命名空间
5.LitJson可以准确的保存null类型

LitJson反序列化

使用LitJson反序列化
方法:
JsonMapper.ToObject(字符串)

jsonStr = File.ReadAllText(Application.persistentDataPath + "/MrTang2.json");
//JsonData是LitJson提供的类对象 可以用键值对的形式去访问其中的内容
JsonData data = JsonMapper.ToObject(jsonStr);
print(data["name"]);
print(data["age"]);
//通过泛型转换 更加的方便 建议使用这种方式
MrTang2 t2 = JsonMapper.ToObject<MrTang2>(jsonStr);

注意:
1.类结构需要无参构造函数,否则反序列化时报错
2.字典虽然支持 但是键在使用为数值时会有问题 需要使用字符串类型
注意事项
1.LitJson可以直接读取数据集合
RoleInfo.json:
在这里插入图片描述

public class RoleInfo2
{public int hp;public int speed;public int volume;public string resName;public int scale;
}
//1
jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/RoleInfo.json");
RoleInfo2[] arr = JsonMapper.ToObject<RoleInfo2[]>(jsonStr);
//2
List<RoleInfo2> list = JsonMapper.ToObject<List<RoleInfo2>>(jsonStr);
//3
jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/Dic.json");
Dictionary<string, int> dicTest = JsonMapper.ToObject<Dictionary<string, int>>(jsonStr);

json数据最后一行加逗号报错:
在这里插入图片描述

2.文本编码格式需要是UTF-8 不然无法加载
总结
1.LitJson提供的序列化反序列化方法 JsonMapper.ToJson和ToObject<>
2.LitJson无需加特性
3.LitJson不支持私有变量
4.LitJson支持字典序列化反序列化
5.LitJson可以直接将数据反序列化为数据集合
6.LitJson反序列化时 自定义类型需要无参构造
7.Json文档编码格式必须是UTF-8

JsonUtility和LitJson对比

JsonUtlity和LitJson相同点
1.他们都是用于Json的序列化反序列化
2.Json文档编码格式必须是UTF-8
3.都是通过静态类进行方法调用
JsonUtlity和LitJson不同点
1.JsonUtlity是Unity自带,LitJson是第三方需要引用命名空间
2.JsonUtlity使用时自定义类需要加特性,LitJson不需要
3.JsonUtlity支持私有变量(加特性),LitJson不支持
4.JsonUtlity不支持字典,LitJson支持(但是键只能是字符串)
5.JsonUtlity不能直接将数据反序列化为数据集合(数组字典),LitJson可以
6.JsonUtlity对自定义类不要求有无参构造,LitJson需要
7.JsonUtlity存储空对象时会存储默认值而不是null,LitJson会存null
如何选择两者
根据实际需求
建议使用LitJson
原因:LitJson不用加特性,支持字典,支持直接反序列化为数据集合,存储null更准确

http://www.lryc.cn/news/343685.html

相关文章:

  • LeetCode 35.搜索插入位置
  • 速来get!多微信聚合聊天功能大揭秘!
  • 【跟我学RISC-V】(一)认识RISC-V指令集并搭建实验环境
  • 如何使用google.protobuf.Struct?
  • Vue3 + TS + Element-Plus 封装的 Dialog 弹窗组件
  • 大数据技术概述_4.大数据的应用领域
  • ABB RobotStudio学习记录(一)新建工作站
  • 雷达通信一体化(含WCSP2023会议论文集学习)
  • 特斯拉擎天柱机器人:工厂自动化的未来
  • 【管理咨询宝藏93】大型制造集团数字化转型设计方案
  • 【数学建模】天然肠衣搭配问题
  • Dockerfile实践java项目
  • 【管理咨询宝藏96】企业数字化转型的中台战略培训方案
  • 【webrtc】MessageHandler 3: 基于线程的消息处理:以sctp测试为例
  • redisson 使用脚本实现将一个队列的元素弹出并推入另一个队列的原子操作
  • 基于Springboot的校园新闻管理系统(有报告)。Javaee项目,springboot项目。
  • Windows环境下基于CMake构建Lua
  • LLM⊗KG范式下的知识图谱问答实现框架思想阅读
  • ue引擎游戏开发笔记(35)——为射击添加轨道,并显示落点
  • 路由策略与路由控制
  • JAVA版本的ATM编程问题记录
  • C#winfrom三层架构实现简单课程管理系统管理系统,三层架构实现增删改查
  • AI技术赋能下的视频监控方案是如何解决新能源汽车充电难问题的?
  • 长难句打卡5.6
  • PDF编辑器软件常见问题(技巧)总结
  • Dive into Deep Learning-优化算法(1)
  • Partisia Blockchain 生态首个zk跨链DEX现已上线
  • .NET操作 Access (MSAccess)
  • shell脚本,删除30天以前的日志,并将日志推送到nas,但运行出现/bin/bash^M。
  • 现身说法暑期三下乡社会实践团一个好的投稿方法胜似千军万马