Unity-数据持久化-JSON

news2024/10/7 16:26:37

一、JsonUtlity

JsonUtlity 是 Unity 自带的用于解析 Json 的公共类。它可以

  1. 将内存中对象序列化为 Json 格式的字符串

  2. 将 Json 字符串反序列化为类对象

1.在文件中存读字符串

using System.IO;

// 1.存储字符串到指定路径文件中
// 第一个参数:填写的是 存储的路径
// 第二个参数:填写的是 存储的字符串内容
// 注意:第一个参数 必须是存在的文件路径 如果没有对应文件夹 会报错
File.WriteAllText(Application.persistentDataPath + "/Test.json", "存储的json文件");
print(Application.persistentDataPath);

// 2.在指定路径文件中读取字符串
string str = File.ReadAllText(Application.persistentDataPath + "/Test.json");
print(str);

2.使用 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;
}

​ 使用方法:public static string ToJson(object obj)

// 序列化:把内存中的数据 存储到硬盘上
// 方法:
// JsonUtility.ToJson(对象)
MrTang t = new MrTang();
t.name  = "xxx";
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 而是默认值的数据

3.使用 JsonUtlity 进行反序列化

​ 使用方法:public static T FromJson<T>(string json)

// 反序列化:把硬盘上的数据 读取到内存中
// 方法:
// 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);

​ 注意:

  1. 如果 Json 中数据少了,读取到内存中类对象中时不会报错
  2. JsonUtlity 无法直接读取数据集合
  3. 文本编码格式需要是 UTF-8,不然无法加载

4.总结

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

二、LitJson

LitJson 是一个第三方库,用于处理 Json 的序列化和反序列化

​ 它是 C# 编写的,体积小、速度快、易于使用

​ 它可以很容易的嵌入到我们的代码中,只需要将 LitJson 代码拷贝到工程中即可

1、获取 LitJson

  1. 前往 LitJson 官网:LitJSON - Home

    image-20220708222230881

  2. 通过官网前往 GitHub 获取最新版本代码

    点击此处下载最新版本:

    image-20220708222349498

  3. 将讲代码拷贝到 Unity 工程中,即可开始使用 LitJson

    代码路径在 litjson-0.18.0 -> src -> LitJson

2、使用 LitJson 进行序列化

​ 使用方法:public static string ToJson(object obj)

using LitJson;

MrTang t = new MrTang();

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

​ 注意:

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

3.使用 LitJson 反序列化

​ 使用方法:public static T ToObject<T>(string json)

// 方法:
// 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. 字典虽然支持 但是键在使用为数值时会有问题 需要使用字符串类型
  3. LitJson 可以直接读取数据集合
  4. 文本编码格式需要是 UTF-8,不然无法加载

4.总结

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

三、 JsonUtlity 和LitJson的对比

​ 1.JsonUtlity 和 LitJson 相同点:

  1. 他们都是用于 Json 的序列化反序列化
  2. Json 文档编码格式必须是 UTF-8
  3. 都是通过静态类进行方法调用

​2. 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.coloradmin.cn/o/782580.html

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

相关文章

四层和七层负载均衡详解

1 概述 四层负载均衡就是工作在计算机网络OSI七层分层的第四层&#xff08;传输层&#xff09;的&#xff0c;七层负载军和则是工作在第七层&#xff08;应用层&#xff09;的。即四层负载均衡是基于IP端口的负载均衡&#xff0c;七层负载均衡是基于URL等应用层信息的负载均衡…

Mysql数据库基本语句

1.数据库操作基本流程 ◼ 连接登陆数据库 ◼ 创建数据库 ◼ 创建数据表 ◼ 插入数据记录 ◼ 断开连接 连接 MySQL 数据库的命令语法格式&#xff1a; mysql [ -h 服务器 IP 或域名 -u 用户名 -p 密码 数据库名称 ]quit 或者 exit 退出数据库 注意事项&#xff1a; 操作指令…

力扣奇遇记 [第一章]

文章目录 &#x1f626;第一题&#xff1a;拿下LeetCode1769. 移动所有球到每个盒子所需的最小操作数学习内容&#xff1a;LeetCode1769. 移动所有球到每个盒子所需的最小操作数&#x1f648;思路分析&#xff1a;&#x1f496;代码产出&#xff1a; &#x1f626;第二题&#…

网络安全 Day16-计算机网络知识01

计算机网络知识01 1. 什么是网络2. 网络分类3. 网卡4. 网线5. MAC地址 1. 什么是网络 局域网&#xff08;私有网&#xff09;图片 路由器作用&#xff1a;隔离网络帮人选择最佳路径。内网地址就是网关。外网地址就是公网地址。 2. 网络分类 局域网&#xff1a;本地私有的一…

leetcode:1313. 解压缩编码列表(python3解法)

难度&#xff1a;简单 给你一个以行程长度编码压缩的整数列表 nums 。 考虑每对相邻的两个元素 [freq, val] [nums[2*i], nums[2*i1]] &#xff08;其中 i > 0 &#xff09;&#xff0c;每一对都表示解压后子列表中有 freq 个值为 val 的元素&#xff0c;你需要从左到右连接…

12.3.3 Shell script 的默认变量($0, $1...)

举例来说&#xff0c;如果你想要重新启动系统的网络&#xff0c;可以这样做&#xff1a; script 是怎么达成这个功能的呢&#xff1f;其实 script 针对参数已经有设置好一些变量名称了&#xff01;对应如下&#xff1a; 执行的脚本文件名为 $0 这个变量&#xff0c;第一个接的参…

AOP操作日志记录(将增、删、改相关接口的操作日志记录到数据库表中)

1.1 需求 需求&#xff1a;将案例中增、删、改相关接口的操作日志记录到数据库表中 就是当访问部门管理和员工管理当中的增、删、改相关功能接口时&#xff0c;需要详细的操作日志&#xff0c;并保存在数据表中&#xff0c;便于后期数据追踪。 操作日志信息包含&#xff1a;…

mac电脑清理系统占用空间清理优化操作教程

mac系统广受用户的喜爱和信赖。但是&#xff0c;很多mac用户可能会发现&#xff0c;随着使用时间的增长&#xff0c;mac系统占用的空间越来越大&#xff0c;导致电脑运行缓慢&#xff0c;甚至出现磁盘空间不足的提示。那么&#xff0c;mac系统内存为什么那么大&#xff1f;mac清…

解析国产音频数模转换芯片的应用领域

数模转换器是用于数模转换的设备。数字信号定义为时间离散和幅度信号离散。同时,将模拟信号定义为时间连续和连续幅度信号。数模转换器将定点二进制数字(适当的抽象精度数字)转换为物理测量结果。数模转换器基于Nyquist-Shannon采样定理工作。它指出&#xff1a;如果采样率大于…

OJ练习第143题——二叉树展开为链表

二叉树展开为链表 力扣链接&#xff1a;114. 二叉树展开为链表 题目描述 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终…

多个deb包合并成一个deb包的方法

文章目录 前言一 deb基础知识1.1 目录结构1.2 包结构说明 二、多个deb包合并一个deb包2.1 下载离线deb包2.2 解压安装包2.3 deb包合并 三、使用合并deb包可能存在的问题四、总结 前言 在UOS系统中默认没有开启开发者模式&#xff0c;此时若需要安装多个deb包时&#xff0c;只能…

最短路算法(Dijkstra Bellman-Ford SPFA Floyd)

目录 最短路算法总览Dijkstra算法1.朴素Dijkstra算法算法步骤算法应用Dijkstra求最短路Ⅰ 2.堆优化Dijkstra算法算法步骤算法应用Dijkstra求最短路Ⅱ Bellman-Ford算法算法步骤算法应用有边数限制的最短路 SPFA算法算法步骤算法应用1. spfa求最短路2. spfa判断负环 Floyd算法算…

STM32MP157驱动开发——GPIO 和 和 Pinctrl 子系统的概念

文章目录 Pinctrl 子系统重要概念概述重要概念pin controller&#xff1a;client device&#xff1a; 代码中怎么引用 pinctrl GPIO 子系统重要概念概述在设备树中指定引脚在驱动代码中调用 GPIO 子系统头文件常用函数实例&#xff1a; BSP工程师针对芯片的寄存器写Pinctrl子系…

代码随想录day25

216. 组合总和 III 这道题和昨天的相似的地方&#xff0c;但是也有不同的特点。这道题规定了数字范围是从1-9&#xff0c;并且一个组合中&#xff0c;不能出现同样的元素&#xff0c;比如说[1&#xff0c;2&#xff0c;2]这个就不可以&#xff0c;如果取过2之后&#xff0c;就只…

在Visual C++中进行类设计的通行做法(下)——类的运行

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下在Visual C中进行类设计的通行做法&#xff0c;这一篇帖子来看看在搭建好基本架构并调整好重复定义问题后&#xff0c;怎么个运行法。程序员新手会去看很多书&#xff0c;但是书中往往…

安装centos7 ping不通宿主机

1、安装Virbox虚拟机 2、安装centos 7镜像 主要有两点配置需要注意&#xff1a; A:磁盘分区 B:网络设置&#xff0c;今天的实验主要是卡在网络配置这里 网络设置&#xff0c;使用的是仅主机模式且是手动分配静态IP,要点说明 看宿主机所用的网络是哪个&#xff0c;查看window的…

OC时钟/BC时钟介绍、Windows/Linux环境查看时钟频率

一、OC时钟和BC时钟介绍 OC时钟和BC时钟是指计算机体系结构中的两种不同的时钟信号。 OC时钟&#xff08;Off-chip clock&#xff09;是指在计算机系统的主板或外部设备上产生的时钟信号&#xff0c;它通过总线传输到CPU中&#xff0c;控制着CPU与主板或外部设备之间的数据传…

Vue简介、生命周期、模版语法、条件渲染、列表渲染、style和class绑定

目录 简介 Vue基本渲染-插值和数据模型 MVVM 生命周期 模版语法 条件渲染 v-if ​编辑 v-show 列表渲染 key style绑定 class绑定 简介 Vue是一套用于构建用户界面的渐进式框架。与其他大型框架不同的是&#xff0c;Vue被设计为可以自底向上逐层应用。Vue的核心库只…

Docker 多主机部署:构建容器集群的最佳实践,助力高可用性与负载均衡

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

加载Ubuntu开发环境-iTOPRK3568开发板

配套视频&#xff1a; 安装虚拟机 ubuntu 系统&#xff1a;B站搜索北京迅为RK3568开发板 在 2.3 小节解压了迅为提供的 ubuntu 镜像&#xff0c;然后打开虚拟机&#xff0c;如下图所示&#xff1a; 点击上图中的红色框&#xff0c;选择在 2.3 小节中解压的 Ubuntu18 文件夹下…