1.10 Unity中的数据存储 JSON

一、介绍

  • Json是最常用也是目前用的比较多的一种,超轻量级,可便捷性使用,平时用到比较多的都是解析Json和往Json中添加数据、修改数据等等
  • JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式,它基于ECMAScript(w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率
  • 在Unity中大致有三种使用Json的方式
  • 分别是使用类库的两种:System.Json(便于JSON生成)和LitJson(便于JSON解析)
  • 还有一种是UnityEngine.Jsonutility
  • 其中前两种都需要将System.Json.dll或 LitJson.dll两个dll文件放到Unity的plugins文件夹中才能使用相应的命名空间和方法
  • UnityEngine.JsonUtility则可以直接使用其中的方法

二、语法规则

  • 数据都放置到一个大括号里
  • 一对对的数据放到大括号里
  • 一个个的数据放到中括号里
  • 一个大括号或一个中括号都可以表示一个值
  • 数据与数据之间用逗号分隔
  • Key必须要用引号引起来
  • Value如果是字符串要用引号引起来
  • 最后一个数据后面不要加逗号
  • 数据保存在键值对中

JSON语法示例:

{"students":[{"name":"albert","age":19,"sex":"M"},{"name":"mary","age":11,"sex":"W"}]
}

解析成实体类后:

public class StudentsItem
{public string name { get; set; }public int age { get; set; }public string sex { get; set; }
}public class Root
{public List <StudentsItem > students { get; set; }
}

由于Json对字符串的格式非常严格,输入一个字符错误都不行,所以我们可以使用相关的Json转换网站进行格式转换
https://www.json.cn/json2csharp.html 这个网站就可以实现JSON数据转实体的功能

三、System.Json

先来说一下System.Json的基本用法
System.Json是一种类库,当我们在Unity中导入System.Json.dll文件后就可以使用System.Json.dll json命名空间
可以用到的类:JsonArray、JsonObject、JsonPrimitive、JsorValue。枚举:JsonType
具体操作,在Unity中新建一个Plugins文件夹,然后将dll文件放入即可

四、示例

using System.Json;
using UnityEngine;public class JsonTest : MonoBehaviour
{void Start(){//创建⼀个JSON对象,相当于⼀个⼤括号JsonObject jsonTransform = new JsonObject();//创建⼀个JSON值对象,存储⼀个ValueJsonValue jsonPosition = "10,20,30";//JSON对象,也就是⼤括号,添加⼀个key:valuejsonTransform.Add("position", jsonPosition);//打印结果Debug.Log(jsonTransform.ToString());//定义⼀个值数组,⽤来存储,中括号中的⼀个个的值JsonValue[] rotationXYZ = new JsonValue[] { 20, 30, 40 };//将这个数组中的⼀个个的值放到JsonArray数组对象中JsonArray jsonRotation = new JsonArray(rotationXYZ);//⼀个JsonArray对象,也可以是⼀个Value,//所以可以⽤jsonTransform来AddjsonTransform.Add("rotation", jsonRotation);//打印结果Debug.Log(jsonTransform);JsonObject x = new JsonObject();x.Add("x", 10);JsonObject y = new JsonObject();y.Add("y", 20);JsonObject z = new JsonObject();z.Add("z", 30);//实例⼀个jsonValues数组(所有类型都可以转换成jsonValue)JsonValue[] scaleXYZ = new JsonValue[] { x, y, z };//将实例好了的数组,添加到jsonArray对象中,形成⼀个jsonArray对象//作⽤在于给这个整体,添加⼀个中括号[]JsonArray jsonScale = new JsonArray(scaleXYZ);//将这个整体,放⼊到jsonTransform中jsonTransform.Add("scale", jsonScale);//打印结果Debug.Log(jsonTransform);}
}

打印结果:

五、LitJson

常用API方法如下:

  • 把对象转化成JSON格式字符串:JsonMapper.ToJson
  • 把JSON格式字符串转化成对象:JsonMapper.ToObject
  • 把JSON格式字符串转化成指定类的对象:JsonMapper.ToObject

1.生成

我们写一个字段类Person,类里面有string类型的"Name"和int型的"Age"
 

using System.IO;
using UnityEngine;[System.Serializable]
class Person
{public string Name;public int Age;
}
[System.Serializable]
class Data
{public Person[] Person;
}
public class NewBehaviourScript : MonoBehaviour
{void Start(){WriteData();}//写数据public void WriteData(){//新建一个数据类Data m_Data = new Data();//新建一个字段类 进行赋值m_Data.Person = new Person[3];for (int i = 0; i < 3; i++){Person m_Person = new Person();m_Person.Name = "User" + i;m_Person.Age = 20 + i;m_Data.Person[i] = m_Person;}//将数据转成jsonstring js = JsonUtility.ToJson(m_Data);//获取到项目路径string fileUrl = Application.dataPath + "\\jsonInfo.txt";//打开或者新建文档using (StreamWriter sw = new StreamWriter(fileUrl)){//保存数据sw.WriteLine(js);//关闭文档sw.Close();sw.Dispose();}}
}

2.解析

先读取Json文件,使用IO命名空间下的File类的OpenText()函数进行读取
然后使用JsonUtility.FromJson进行解析

using System.IO;
using UnityEngine;[System.Serializable]
class Person
{public string Name;public int Age;
}
[System.Serializable]
class Data
{public Person[] Person;
}
public class NewBehaviourScript : MonoBehaviour
{void Start(){string jsonData = ReadData();Data m_PersonData = JsonUtility.FromJson<Data>(jsonData);foreach (Person item in m_PersonData.Person){Debug.Log(item.Name);Debug.Log(item.Age);}}//读取文件public string ReadData(){//string类型的数据常量string readData;//获取到路径string fileUrl = Application.dataPath + "\\jsonInfo.json";//读取文件using (StreamReader sr = File.OpenText(fileUrl)){//数据保存readData = sr.ReadToEnd();sr.Close();}//返回数据return readData;}
}

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

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

相关文章

Spark---RDD序列化

文章目录 1 什么是序列化2.RDD中的闭包检查3.Kryo 序列化框架 1 什么是序列化 序列化是指 将对象的状态信息转换为可以存储或传输的形式的过程。 在序列化期间&#xff0c;对象将其当前状态写入到临时或持久性存储区。以后&#xff0c;可以通过从存储区中读取或反序列化对象的…

[算法与数据结构][c++]:Static关键字和全局变量

Static关键字和全局变量 1. 生命周期、作用域和初始化时机2. 全局变量3. Static 关键字3.1 面向过程3.1.1 静态全局变量3.1.2 静态局部变量&#xff08;单例中会使用&#xff09;3.1.3 静态函数 3.2 面向对象3.2.1 类内静态成员变量3.2.2 类内静态成员函数 Reference 写在前面&…

详细讲解MybatisPlus实现逻辑删除

目录 前言1. 基本知识2. 实战Demo3. 拓展 前言 对于MybatisPlus的相关知识可在我的博客进行搜索 对应的CRUD相关知识也可看我这篇文章&#xff1a;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 在讲述逻辑删除这个概念时&#xff0c;先引入另外一个概念&…

09.简单工厂模式与工厂方法模式

道生一&#xff0c;一生二&#xff0c;二生三&#xff0c;三生万物。——《道德经》 最近小米新车亮相的消息可以说引起了不小的轰动&#xff0c;我们在感慨SU7充满土豪气息的保时捷设计的同时&#xff0c;也深深的被本土品牌的野心和干劲所鼓舞。 今天我们就接着这个背景&…

2019年认证杯SPSSPRO杯数学建模B题(第一阶段)外星语词典全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 基于方差分布的方法对未知语言文本中重复片段的自动搜索问题的研究 B题 外星语词典 原题再现&#xff1a; 我们发现了一种未知的语言&#xff0c;现只知道其文字是以 20 个字母构成的。我们已经获取了许多段由该语言写成的文本&#xff0c;但…

Phoenix基本使用

1、Phoenix简介 1.1 Phoenix定义 Phoenix是HBase的开源SQL皮肤。可以使用标准JDBC API代替HBase客户端API来创建表&#xff0c;插入数据和查询HBase数据。 1.2 Phoenix特点 容易集成&#xff1a;如Spark&#xff0c;Hive&#xff0c;Pig&#xff0c;Flume和Map Reduce。性能…

golang并发安全-select

前面说了golang的channel&#xff0c; 今天我们看看golang select 是怎么实现的。 数据结构 type scase struct {c *hchan // chanelem unsafe.Pointer // 数据 } select 非默认的case 中都是处理channel 的 接受和发送&#xff0c;所有scase 结构体中c是用来存储…

C++模板——(4)C++泛型编程与标准模板库简介

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 勤奋&#xff0c;机会&#xff0c;乐观…

海量数据处理数据结构之Hash与布隆过滤器

前言 随着网络和大数据时代的到来&#xff0c;我们如何从海量的数据中找到我们需要的数据就成为计算机技术中不可获取的一门技术&#xff0c;特别是近年来抖音&#xff0c;快手等热门短视频的兴起&#xff0c;我们如何设计算法来从大量的视频中获取当前最热门的视频信息呢&…

Vue3:使用解构赋值来读取对象里的键-值对(值也是对象)

一、前言 在Vue3中&#xff0c;想要读取一个对象的“键—值”对&#xff08;值也是一个对象&#xff09;&#xff0c;数据格式如下&#xff1a; {1:{courseName: 课程1, study: 951526, visit: 3785553}&#xff0c;2:{courseName: 课程2, study: 181630, visit: 380830}&…

VCG 网格曲率计算

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 Mesh曲率特征通常指的是在三维几何网格(Mesh)上计算的曲率相关的一系列特征,包括主曲率、高斯曲率、平均曲率等。这些曲率特征提供了对Mesh表面形状的详细描述,对于表面形状分析、形状比较和几何建模等领域非常…

【UML】第16篇 活动图

目录 一、什么是活动图 二、应用场景&#xff1a; 三、绘图符号的说明&#xff1a; 四、语法&#xff1a; 五、例图 六、建模的流程 6.1 对业务流程建模时 6.2 对用例进行活动图建模时 一、什么是活动图 活动图&#xff08;Activity Diagram&#xff09;是UML中用于描…

msckf-vio 跑Euroc数据集,并用evo进行评估

所需材料&#xff1a; Euroc数据集主页&#xff1a;https://projects.asl.ethz.ch/datasets/doku.php?idkmavvisualinertialdatasetsevo评估工具代码&#xff1a;https://github.com/MichaelGrupp/evo向msckf-vio中添加保存位姿的代码&#xff0c;可参考https://blog.csdn.ne…

网络安全复习--简答整理

-----------------------------------------------------教材如上图------------------------------------------------------------ 1.对称加密和非对称加密各有什么特点&#xff1f;加密解密过程中有什么区别&#xff1f;优点P38【考】 对称加密的特点&#xff1a;在针对同一…

JDBC多表联查

JDBC多表联查 在单一表进行查询时&#xff0c;只需要对表中的单个字段进行解析即可&#xff1b;例如下面代码&#xff1a; Overridepublic List<ClassBean> selectAllDao() {List list new ArrayList();try {String sql "select * from class";rs select(s…

Spring MVC 参数接收

参数接收 Springmvc中&#xff0c;接收页面提交的数据是通过方法形参来接收&#xff1a; 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型&#xff0c;所以spirngmvc提供了很多converter&#xff08;转换器…

网络名称解读 -入门5

WAN: Wide Area Network(跨区域&#xff09;&#xff0c;LAN&#xff1a; Local Area NetworkWAN MAC&#xff0c; 用来连接上级网络&#xff0c; LAN MAC&#xff0c; 用于内部网路。 LAN & WAN 3.1&#xff0c;LAN表示子网&#xff0c;通过掩码来筛选子网内主机数量&…

Unity Delaunay三角剖分算法 动态生成

Unity Delaunay三角剖分算法 动态生成 Delaunay三角剖分Delaunay三角剖分 定义Delaunay 边Delaunay 空圆特性 Delaunay 三角形Delaunay 最大化最小角特性 Delaunay 三角形特征Delaunay 算法Delaunay Lawson算法Delaunay Bowyer-Watson算法 Unity Delaunay三角剖分 应用Unity 工…

Vulnhub-VULNCMS: 1渗透

文章目录 一、前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、获取shell三、获取密码文件四、提权 一、前言 由于在做靶机的时候&#xff0c;涉及到的渗透思路是非常的广泛&#xff0c;所以在写文章的时候都是挑重点来写&#xff0c;尽量的不饶弯路。具体有…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端鉴权拦截器实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…