【Unity】数据持久化--JSON

1、JSON基础语法

1.1 注释内容

单行注释 //

多行注释 /* 内容 */

//注释内容
/*
多行注释
123
e1
ds
*/
/*

1.2 符号含义

大括号 {} 对象

中括号 [] 数组

冒号   : 键值对对应关系

逗号   , 数据分割

双引号 "" 键名/字符串

1.3 键值对表示

"键名":值内容

1.4 值类型

数字(整数或浮点)

字符串

true或false

数组

对象

null

{"name":"小周","age":24,"sex":true,"ids":[1, 2, 3],"students":[{"name":"小红", "age":18, "sex":false},{"name":"小明", "age":18, "sex":true}],"home":{"address":"重庆市垫江县","street":""},"son":{"name":"小周周","age":7,"sex":true}
}

2、JsonUtility

2.1 JsonUtility介绍

JsonUtility是Unity自带的用于解析Json的公共类

它可以将内存中对象序列化为Json格式的字符串,也可以将Json字符串反序列化为类对象

2.2 在文件中存读字符串

1) 存储字符串到指定路径文件中

File.WriteAllText(arg1, arg2)

第一个参数 填写的是存储的路径

第二个参数 填写的是 存储的字符串内容

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

File.ReadAllText(path)

        //1.存储字符串到指定路径文件中//第一个参数 填写的是存储的路径!//第二个参数 填写的是 存储的字符串内容 string path = Application.persistentDataPath + "/Test.json";File.WriteAllText(path, "大哥存储的JSON文件");Debug.Log(path);//2.在指定路径文件中读取字符串string str = File.ReadAllText(path);Debug.Log(str);

2.3 使用JsonUtlity进行序列化

序列化:把内存中的数据 存储到硬盘上

JsonUtility.ToJson(对象)

[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 testFloat;public double testDouble;public int[] ids;public List<int> ids2;public Dictionary<int, string> dic;public Dictionary<string, string> dic2;public Student s1;public List<Student> s2s;}[Serializable]
public class RoleInfo
{public int hp;public int speed;public int volume;public string resName;public int scale;
}//序列化:把内存中的数据 存储到硬盘上//方法://JsonUtility.ToJson(对象)MrTang t = new MrTang();t.name = "小周";t.age = 18;t.sex = true;t.testFloat = 1.1f;t.testDouble = 1.5;t.ids = new int[] { 1, 2, 3 };t.ids2 = new List<int>() { 2, 3, 5, 6 };t.dic = new Dictionary<int, string>() {{1, "123" },{2, "234" }};t.dic2 = new Dictionary<string, string>() {{"12", "123" },{"sds", "234" }};t.s1 = new Student(18, "adada");t.s2s = new List<Student>() { new Student(12, "小红"), new Student(17, "小明") };//]sonutility提供了线程的方法 可以把类对象 序列化为 json字符串string jsonStr = JsonUtility.ToJson(t);File.WriteAllText(Application.persistentDataPath + "/MrTang.json", jsonStr);

注意:

  • float序列化时看起来会有一些误差
  • 自定义类需要加上序列化特性[system.serializable]
  • 想要序列化私有变量 需要加上特性[serializeField]
  • JsonUtility不支持字典
  • Jsonutlity存储nu11对象不会是nu11 而是默认值的数据

2.4 使用JsonUtility进行反序列化

反序列化:把硬盘上的数据 读取到内存中

JsonUtility.FremJson(字符串)

        //读取文件中的 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中数据少了,读取到内存中类对象中时不会报错

2.5 注意事项

  • 自定义尖需变加上序列化特性[System.serializable]
  • 私有保护成员 需要加上[SerializeField]
  • JsonUtility无法直接渎取数据集合
  • 文本编码格式需要时UTF-8 不然无法加载

3、LitJson

3.1 LitJson是什么

  • 它是一个第三方库,用于处理1son的序列化和反序列化
  • LitJson是c#编写的,体积小、速度快、易于使用
  • 它可以很容易的嵌入到我们的代码中
  • 只需要将LitJson代码拷贝到工程中即可

3.2 获取LitJson

  • 前往LitJson官网
  • 通过官网前往GitHub获取最新版本代码
  • 讲代码拷贝到unity工程中 即可开始使用LitJson

3.3 使用LitJson进行序列化

JsonMapper.ToJson(对象)

        //JsonMapper.ToJson(对象)MrTang2 t = new MrTang2();t.name = "下周";t.age = 18;t.sex = true;t.testFloat = 1.55f;t.testDouble = 1.4;t.ids = new int[] { 1, 2, 3 };t.ids2 = new List<int>() { 2, 3, 5, 6 };//t.dic = new Dictionary<int, string>() {//    {1, "123" },//    {2, "234" }//};t.dic2 = new Dictionary<string, string>() {{"12", "123" },{"sds", "234" }};//t.s1 = new Student2(18, "adada");t.s1 = null;t.s2s = new List<Student2>() { new Student2(12, "小红"), new Student2(17, "小明") };string jsonStr = JsonMapper.ToJson(t);Debug.Log(Application.persistentDataPath);File.WriteAllText(Application.persistentDataPath + "/MrTang2.json", jsonStr);

注意:

  • 相对JsonUtility不需要加特性
  • 不能序列化私有变量
  • 支持字曲类型
  • 需要引用LitJson命名空间
  • LitJson可以准确保存null

3.4 使用LitJson反序列化

JsonMapper.ToObject(字符串)

        jsonStr = File.ReadAllText(Application.persistentDataPath + "/MrTang2.json");JsonData data = JsonMapper.ToObject(jsonStr);Debug.Log(data["name"]);Debug.Log(data["age"]);MrTang2 st2 = JsonMapper.ToObject<MrTang2>(jsonStr);

注意:

  • 类结构需要无参构造函数,否则反序列化时报错
  • 字典虽然支持 但是键在使用为数值时会有问题 需要使用字符串类型

3.5 注意事项

  • Litson无需加特性
  • LitJson不支持私有变量
  • LitJson支持字典序列化反序列化
  • Litison可以直接将数据反序列化为数据集合
  • LitJson反序列化时 自定义类型需要无参构造
  • Json文档编码格式必须是UTF-8

4、Json数据管理类

另外需要LitJson代码

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{get{return instance;}}private JsonMgr() { }/// <summary>/// 存储JSON数据 序列化/// </summary>public void SavaData(object data, string fileName, JsonType jsonType = JsonType.LitJson){//确定存储路径string path = Application.persistentDataPath + "/" + fileName + ".json";Debug.Log(path);//序列化 得到Json字符串string jsonStr = "";switch (jsonType){case JsonType.JsonUtility:jsonStr = JsonUtility.ToJson(data);break;case JsonType.LitJson:jsonStr = JsonMapper.ToJson(data);break;default:break;}//把序列化的Json字符串 存储到指定路径中File.WriteAllText(path, jsonStr);}/// <summary>/// 读取指定文件中的 json数据 反序列化/// </summary>/// <typeparam name="T"></typeparam>/// <param name="fileName"></param>/// <param name="jsonType"></param>/// <returns></returns>public T LoadData<T>(string fileName, JsonType jsonType = JsonType.LitJson) where T : class, new(){//确定从哪个路径读取//首先先判断 默认数据文件夹中是否有我们想要的数据 如果有 就从中获取string path = Application.persistentDataPath + "/" + fileName + ".json";//先判断 是否存在这个文件//如果不存在默认文件 就从 读写文件夹中去寻找if (!File.Exists(path))path = Application.streamingAssetsPath + "/" + fileName + ".json";//如果读写文件夹中都还没有 那就返回一个默认对象if (!File.Exists(path))return new T();//进行反序列化string jsonStr = File.ReadAllText(path);T data = default(T);switch (jsonType){case JsonType.JsonUtility:data = JsonUtility.FromJson<T>(jsonStr);break;case JsonType.LitJson:data = JsonMapper.ToObject<T>(jsonStr);break;default:break;}//把对象返回出去return data;}}

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

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

相关文章

外贸企业选择什么网络?

随着全球化的深入发展&#xff0c;越来越多的国内企业将市场拓展到海外。为了确保外贸业务的顺利进行&#xff0c;企业需要建立一个稳定、安全且高速的网络。那么&#xff0c;外贸企业应该选择哪种网络呢&#xff1f;本文将为您详细介绍。 外贸企业应选择什么网络&#xff1f; …

pytest-yaml-sanmu(五):跳过执行和预期失败

除了手动注册标记之外&#xff0c;pytest 还内置了一些标记可直接使用&#xff0c;每种内置标记都会用例带来不同的特殊效果&#xff0c;本文先介绍 3 种。 1. skip skip 标记通常用于忽略暂时无法执行&#xff0c;或不需要执行的用例。 pytest 在执行用例时&#xff0c;如果…

Redis 7.x 系列【14】数据类型之流(Stream)

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 XADD2.2 XRANGE2.3 XREVRANGE2.4 XDEL2.5 XLEN2.6 XREAD2.7 XG…

【.Net】Web项目部署腾讯云

文章目录 总述前置准备docker-compose部署普通部署 参考 总述 前置准备 云服务添加端口 另有linux本身防火墙请参考&#xff1a; 【Linux】防火墙命令 需安装.Net SDK和Asp .Net Runtime 注意&#xff1a; 1、sdk也要不只是runtime 2、是Asp .Net Runtime不是.Net Runtime …

国产音频放大器工作原理以及应用领域

音频放大器是在产生声音的输出元件上重建输入的音频信号的设备&#xff0c;其重建的信号音量和功率级都要理想&#xff1a;如实、有效且失真低。音频范围为约20Hz&#xff5e;20000Hz&#xff0c;因此放大器在此范围内必须有良好的频率响应&#xff08;驱动频带受限的扬声器时要…

BIOS设置与系统分区

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 一BIOS 1破解密码的前提 2B…

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…

【web3】分享一个web入门学习平台-HackQuest

前言 一直想进入web3行业&#xff0c;但是没有什么途径&#xff0c;偶然在电鸭平台看到HackQuest的共学营&#xff0c;发现真的不错&#xff0c;并且还接触到了黑客松这种形式。 链接地址&#xff1a;HackQuest 平台功能 学习路径&#xff1a;平台有完整的学习路径&#xff…

金蝶云星空字段之间连续触发值更新

文章目录 金蝶云星空字段之间连续触发值更新场景说明具体需求&#xff1a;解决方案 金蝶云星空字段之间连续触发值更新 场景说明 字段A配置了字段B的计算公式&#xff0c;字段B配置了自动C的计算公式&#xff0c;修改A的时候&#xff0c;触发了B的重算&#xff0c;但是C触发不…

ABeam×StartUp | ABeam德硕中国新创部门拜访通用机器人初创公司 :逐际动力,就具身智能机器人的发展展开交流

近日&#xff0c;ABeam中国新创部门有幸拜访了深圳逐际动力科技有限公司&#xff08;以下简称&#xff1a;逐际动力&#xff09;。作为一家通用机器人公司&#xff0c;其在人形机器人、四轮足机器人等领域具有深厚的学术与技术储备。 现场合影 左&#xff1a;ABeam中国新创部门…

最快33天录用!一投就中的医学4区SCI,几乎不退稿~

【SciencePub学术】今天小编给大家推荐2本生物医学领域的SCI&#xff0c;此期刊为我处目前合作的重点期刊&#xff01;影响因子0-3.0之间&#xff0c;最重要的是审稿周期较短&#xff0c;对急投的学者较为友好&#xff01; 医学医药类SCI 01 / 期刊概况 【期刊简介】IF&…

多模态融合 + 慢病精准预测

多模态融合 慢病精准预测 慢病预测算法拆解子解法1&#xff1a;多模态数据集成子解法2&#xff1a;实时数据处理与更新子解法3&#xff1a;采用大型语言多模态模型&#xff08;LLMMs&#xff09;进行深度学习分析 慢病预测更多模态 论文&#xff1a;https://arxiv.org/pdf/2406…

高通骁龙(Qualcomm Snapdragon)CDSP HVX HTP 芯片简介与开发入门

1. Hexagon DSP/HVX/HTP 硬件演进 说到高通骁龙芯片大家应该不会陌生&#xff0c;其作为最为广泛的移动处理器之一&#xff0c;几乎每一个品牌的智能手机都会使用高通骁龙的处理器。 高通提供了一系列骁龙芯片解决方案。根据性能强弱分为了5个产品系列&#xff1a;从最高端的…

数据结构_1.0

一、数据结构概述 1.1 概念 在计算机科学中&#xff0c;数据结构是一种数据组织、管理和存储的格式 。它是相互之间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技…

【C语言】typedef 关键字

在C语言中&#xff0c;typedef关键字用于给现有的数据类型起一个新的名字。它在提高代码可读性、简化复杂类型声明、增强可维护性方面非常有用。typedef通常用于定义结构体、指针、函数指针以及其他复杂类型。 基本用法 typedef int MyInt; MyInt x 10;在这个例子中&#xf…

wps linux node.js 加载项开发,和离线部署方案

环境准备 windwos 安装node.js 安装VSCode 安装wps linux 安装node.js 安装VSCode 安装wps 通过npm 安装wpsjs SDK 使用npm安装wpsjs npm install -g wpsjs 创建一个项目 wpsjs create WPS-Addin-PPT 创建项目会让你选择2个东西&#xff1a; 1&#xff1a;选择你的文…

SpringBoot实现图片添加水印(完整)

提示&#xff1a;昨天不是写了一个类似与图片添加水印的版本吗,今天来写一个带数据库&#xff0c;并且可以完整访问的版本 文章目录 目录 文章目录 引入库 配置文件 数据库配置 字段配置 索引配置 数据库表语句 启动文件 前端代码 整体代码目录 配置类AppConfig Contro…

五千元软考补贴,这个地区的人别错过!

软考合格者可享受一些补贴&#xff0c;最高可达25万&#xff1f;&#xff01;持有软考证书可领取哪些补贴&#xff1f;软考补贴详细信息 由于不同地区政策有时间限制&#xff0c;符合条件的人员应尽快领取哦~ 今天继续分享常德地区的补贴信息。 这里给大家总结一下和软考有关…

Java的日期类常用方法

Java_Date 第一代日期类 获取当前时间 Date date new Date(); System.out.printf("当前时间" date); 格式化时间信息 SimpleDateFormat simpleDateFormat new SimpleDateFormat("yyyy-mm-dd hh:mm:ss E); System.out.printf("格式化后时间" si…