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值对象,存储⼀个Value
        JsonValue jsonPosition = "10,20,30";
        //JSON对象,也就是⼤括号,添加⼀个key:value
        jsonTransform.Add("position", jsonPosition);
        //打印结果
        Debug.Log(jsonTransform.ToString());

        //定义⼀个值数组,⽤来存储,中括号中的⼀个个的值
        JsonValue[] rotationXYZ = new JsonValue[] { 20, 30, 40 };
        //将这个数组中的⼀个个的值放到JsonArray数组对象中
        JsonArray jsonRotation = new JsonArray(rotationXYZ);
        //⼀个JsonArray对象,也可以是⼀个Value,
        //所以可以⽤jsonTransform来Add
        jsonTransform.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;
        }

        //将数据转成json
        string 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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git 使用 submodule 如何指定分支

写在前面, 作为一个前端我是不喜欢使用 submodule的, 我更喜欢 npm 包的管理方式。 首次添加子模块 git submodule add -b <branch> <remote> <path> 不指定分支就不传 -b <branch> <branch> 分支名<remote> 仓库地址<path> 子模块…

Unity中URP下抓屏的 开启 和 使用

文章目录 前言一、抓屏开启1、Unity下开启抓屏2、Shader中开启抓屏 二、抓屏使用1、设置为半透明渲染队列&#xff0c;关闭深度写入2、申明纹理和采样器3、在片元着色器使用请添加图片描述 三、测试代码 前言 我们在这篇文章中看一下&#xff0c;URP下怎么开启抓屏。 一、抓屏…

兴业证券分布式数据库云应用实践

数据库技术作为信息技术应用创新过程中的一项重要技术&#xff0c;其面临的难题也是亟需解决的关键问题。兴业证券在《集团五年金融科技规划》中提出&#xff0c;要以信息技术应用创新架构评审为抓手&#xff0c;制定信息技术应用创新规划和建设方案&#xff0c;以高可用性、开…

LeetCode+ 56 - 60

合并区间 双指针算法、位运算、离散化、区间合并_小雪菜本菜的博客-CSDN博客 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& a) {vector<vector<int>> res;if(a.empty()) return res;sort(a.begin(),a.en…

10款强大的iPhone微信恢复软件:轻松恢复丢失的微信数据

微信已成为近年来最受欢迎的消息和社交媒体平台之一。它在全球拥有数百万用户&#xff0c;让人们能够联系、分享时刻并进行各种交易。随着微信的普及&#xff0c;对全面恢复解决方案的需求从未如此之大。本文探讨了专为 iPhone 用户设计的十款顶级微信恢复软件选项。每个软件都…

别不信,搭建企业知识库后真的效率翻倍了

在当今信息时代&#xff0c;知识是最宝贵的财富。一个企业要想越办越大&#xff0c;就需要保证信息的透明度和流通率。而搭建一套企业知识库&#xff0c;就能实现这个目标。今天我们就来聊聊为什么建立企业知识库后&#xff0c;你的工作效率会大大提高。同时&#xff0c;我们会…

智慧医院之定位导航解决方案

移动端LBS应用 通过绘制院方各楼栋各层平面图,利用无线/蓝牙技术可对终端进行实时定位,方便病人、家属等就医,提高就医体验,减少工作人员工作量,减少医患冲突,打造智慧医院。 移动端的LBS位置应用,可分为医院的室内地图展现、室内地图搜索、室内导航、室内定位、室内位…

x-cmd pkg | agg - asciinema gif 生成器

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 由 asciinema 团队开发的 asciinema gif 生成器&#xff0c;用于将 asciinema 生成的 asciicast 文件转化为 GIF 文件&#xff0c;具有精确的帧定时&#xff0c;且支持指定字体和颜色主题&#xff0c;能生成更为精美的…

JavaScript系列——闭包

文章目录 闭包定义词法作用域闭包示例使用场景创建私有变量ES5 中&#xff0c;解决循环变量的作用域问题 小结 闭包定义 闭包&#xff0c;是函数及其关联的周边环境的引用的组合&#xff0c;在闭包里面&#xff0c;内部函数可以访问外部函数的作用域&#xff0c;而外部函数不能…

江山易改本性难移之ZYNQ SDK QSPI固化bug及其解决方法

之前在Vivado2018.3通过QSPI方式固化程序时出现问题&#xff0c;显示flash擦除成功&#xff0c;但最后总是不能写入到flash中。 查资料发现从VIVADO 2017.3版本开始&#xff0c;Xilinx官方为了使Zynq-7000和Zynq UltraScale 实现流程相同&#xff0c;在QSPI FLASH使用上做了变化…

【数模百科】一篇文章讲清楚层次分析法的原理和解法步骤

本文节选自 层次分析法原理 - 数模百科&#xff0c;如果你想了解更多关于层次分析法的信息&#xff0c;请移步数模百科。 层次分析法&#xff08;Analytic Hierarchy Process&#xff0c;简称AHP&#xff09;是一种解决复杂决策问题的方法。这个方法是由美国运筹学家托马斯萨蒂…

Java 常见缓存详解以及解决方案

一. 演示Mybatis 一级缓存 首先我们准备一个接口 两个实现的方法&#xff0c; 当我们调用这个queryAll&#xff08;&#xff09;方法时我们需要调用selectAll&#xff08;&#xff09;方法来查询数据 调用此接口实现效果 这个时候我们就可以发现了问题&#xff0c;我们调用方法…

发起人自选-钉钉审批

场景描述 配置一个审批流程&#xff0c;在某些审批节点&#xff0c;不能确定谁具体来审批&#xff0c;所以需要手工选择一个人或者多个人保证流程能得以顺利通过。有些审批流程的做法是&#xff0c;上一个节点来选择指定的人&#xff0c;而钉钉的做法是发起人来指定。 钉钉设…

软件测试|探索Python中获取最高数值的几种方法

前言 在数据分析、统计和编程领域&#xff0c;经常会遇到需要从一组数值中找出最高数值的情况。Python 作为一门功能丰富的编程语言&#xff0c;提供了多种方法来实现这一目标。在本文中&#xff0c;我们将探索几种获取最高数值的方法&#xff0c;帮助大家在不同情况下选择最适…

EasyMR:为 AI 未来赋能,打造弹性大数据引擎的革命

如果要评一个2023科技圈的热搜榜&#xff0c;那么以人工智能聊天机器人 ChatGPT 为代表的 AI大模型 绝对会霸榜整个2023。 ChatGPT 于2022年11月30日发布。产品发布5日&#xff0c;注册用户数就超过100万。推出仅两个月后&#xff0c;它在2023年1月末的月活用户已经突破了1亿&…

Qt QSpinBox微调框控件

文章目录 1 属性和方法1.1 值1.2 步长1.3 循环1.4 加速1.5 前缀和后缀1.6 信号和槽 2 实例2.1 布局2.2 代码实现 微调框&#xff0c;允许用户按照一定的步长&#xff0c;来增加或减少其中显示的数值 修改微调框数值的方式包括&#xff1a; 单击右侧的向上/向下按钮按键盘的向上…

C语言 - 最简单,最易懂的指针、引用讲解

一、变量、地址、变量值 二、直接上代码&#xff0c;一边看上图&#xff0c;一边讲解 #include <stdio.h>struct Hello {int a;int b; };int main() {struct Hello h;h.a 10;h.b 20;struct Hello *hp;hp &h;printf("1: h的地址是%d&#xff0c;hp地址是%d \…

18.标题统计*

题目 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String str sc.nextLine();int res 0;for(int i0;i<str.length();i) {char c str.charAt(i);if(c! && c!\n) {res;}}System.o…

LabVIEW在金属铜大气腐蚀预测评价系统中的应用

为了应对电子设备和仪器中金属铜因大气腐蚀带来的挑战&#xff0c;开发一种基于LabVIEW平台的先进预测评价系统。这个系统的设计宗旨是准确预测并评估在不同室内外环境中金属铜的腐蚀状况。我们团队在LabVIEW的强大数据处理和图形化编程支持下&#xff0c;结合实际的大气腐蚀数…

解锁行内元素和块元素的奥秘:网页开发的基础

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…