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.mzph.cn/news/613255.shtml

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

相关文章

Leetcode18-算术三元组的数目(2367)

1、题目 给你一个下标从 0 开始、严格递增 的整数数组 nums 和一个正整数 diff 。如果满足下述全部条件&#xff0c;则三元组 (i, j, k) 就是一个 算术三元组 &#xff1a; i < j < k &#xff0c; nums[j] - nums[i] diff 且 nums[k] - nums[j] diff 返回不同 算术三…

PR-视频去水印

文章目录 前言PR-视频去水印实现示例 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊!!! PR-视频…

python绘制热力图-数据处理-VOC数据类别标签分布及数量统计(附代码)

前言 当你需要统计训练数据中每个类别标签有多少&#xff0c;并且想知道坐标中心分布在图像的位置信息时&#xff0c;你可以利用一下脚本进行计算&#xff01; 步骤 要绘制热力图来分析VOC数据的分布统计&#xff0c;可以按照以下步骤进行&#xff1a; 数据处理&#xff1…

XCTF:MISCall[WriteUP]

使用file命令&#xff0c;查看该文件类型 file d02f31b893164d56b7a8e5edb47d9be5 文件类型&#xff1a;bzip2 使用bzip2命令可对该文件进行解压 bzip2 -d d02f31b893164d56b7a8e5edb47d9be5 生成了一个后缀为.out的文件 再次使用file命令&#xff0c;查看该文件类型 file…

缓存代理服务器

1 缓存代理 1.1 缓存代理的概述 web代理的作用 缓存网页对象&#xff0c;减少重复请求 存储一些之前被访问的或且可能将要备再次访问的静态网页资源对象&#xff0c;使用户可以直接从缓存代理服务器获取资源&#xff0c;从而减少上游原始服务器的负载压力&#xff0c;加快整…

LeetCode刷题--- 地下城游戏

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

在软件测试过程中如何有效的开展接口自动化测试

一.简介 接口自动化测试是指使用自动化测试工具和脚本对软件系统中的接口进行测试的过程。其目的是在软件开发过程中&#xff0c;通过对接口的自动化测试来提高测试效率和测试质量&#xff0c;减少人工测试的工作量和测试成本&#xff0c;并且能够快速发现和修复接口错误&#…

如何保护linux服务器远程使用的安全

服务器安全是一个非常敏感的问题&#xff0c;因服务器远程入侵导致数据丢失的安全问题频频出现&#xff0c;一旦服务器入侵就会对个人和企业造成巨大的损失。因此&#xff0c;在日常使用服务器的时候&#xff0c;我们需要采取一些安全措施来保障服务器的安全性。 目前服务器系…

如何在IntelliJ IDEA中配置SSH服务器开发环境并实现固定地址远程连接

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境&#xff0c;并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

某mps政务网站jsl加速乐cookie逆向解析

本文针对的目标网站如下&#xff0c;使用base64解密获得 aHR0cHM6Ly93d3cubXBzLmdvdi5jbi8 开篇&#xff1a;加速乐其实算是比较好处理的逆向问题了&#xff0c;了解过的朋友都知道&#xff0c;其本身跟瑞数相似&#xff0c;都是设置cookie后才能成功&#xff0c;设置cookie的过…

ChatGPT会给教育界带来怎样的冲击,又将与教育碰撞出怎样的火花?

11 月 7 日凌晨&#xff0c;美国人工智能公司 OpenAI 的开发者大会正式开启&#xff0c;创始人 Sam Altman 和其同事&#xff0c;发布了团队最新的成果GPT-4 Turbo&#xff0c;新一代的GPT不仅更快、有更长的上下文、而且更好的控制。而随之推出的「GPTs」——让人们能用自然语…

炫云云模型常见咨询问题TOP榜

在上一期&#xff0c;小编带大家盘点了炫云云渲染软件相关常见咨询问题。这份榜单不仅是对过去一年用户关注焦点的回顾&#xff0c;更是一个汇总了各类问题解答的宝典。无论您是初次使用还是老用户&#xff0c;都能帮助您更快速地解决疑问&#xff0c;提升使用炫云各类产品的便…

Vs2019创建c文件

每一个人都是小白开始学习的&#xff0c;学长本身在开始学习计算机编程以前&#xff0c;也是对编程语言畏之如虎&#xff0c;一头雾水。成长都是有规律的&#xff0c;&#xff0c;都是从不会到会&#xff0c;再从会到熟练。如果要问我为什么&#xff0c;唯有多练习耳&#xff0…

分布式引擎Elasticsearch本地部署并结合内网穿透远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

LeetCode-1822/1502/896/13

1.数组元素积的符号&#xff08;1822&#xff09; 题目描述&#xff1a; 已知函数 signFunc(x) 将会根据 x 的正负返回特定值&#xff1a; 如果 x 是正数&#xff0c;返回 1 。 如果 x 是负数&#xff0c;返回 -1 。 如果 x 是等于 0 &#xff0c;返回 0 。 给你一个整数数组…

详解java中ArrayList

目录 前言 一、ArrayList是什么 二、ArrayList使用 1、ArrayList的构造 2 、ArrayList常见操作 3、 ArrayList的遍历 4、 ArrayList的扩容机制 三、来个练习 前言 当你看到这篇文章我觉得很好笑&#xff0c;因为我开始也不懂ArrayList现在轮到你了&#xff0c;嘻嘻嘻&am…

Redis面试篇

redis面试题主要内容 面试官在面试时主要会问以下这些方面的问题 下面是一些问题示例&#xff1a; redis-使用场景 缓存 缓存穿透 介绍 缓存穿透&#xff1a;查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都会去查数…

001讲:CAD对话框出现乱码解决方案——CAD知识讲堂

CAD对话框中字体乱码的解决办法&#xff1a; 删掉CAD安装文件目录font字体库的 simsun.ttc 文件&#xff0c;然后彻底关闭CAD&#xff0c;重新打开cad即可解决问题。 如果还不行&#xff0c;对话框出现乱码原来是拷贝CAD字体中存在.TTC和*.TTF格式文件的问题&#xff0c;找到ca…

Redis未授权访问漏洞复现与工具安装

目录 一、漏洞简介 二、靶场搭建 三、漏洞检测 四、工具安装 五、远程连接 六、利用Redis写入webshell 七、redis-getShell工具 八、ssh公私钥免密登录 九、其他 一、漏洞简介 redis是一个数据库&#xff0c;默认端口是6379&#xff0c;redis默认是没有密码验证的&…

了解Python中的requests.Session对象及其用途

前言 在Python的网络编程中&#xff0c;requests库是一个非常流行的HTTP客户端库&#xff0c;用于发送各种类型的HTTP请求。在requests库中&#xff0c;requests.Session对象提供了一种在多个请求之间保持状态的方法本文将探讨Python中的requests.Session对象及其用途&#xf…