Unity—JSON

每日一句:手简素中,感生活恬淡,心有所期,忙而不茫

目录

服务器

常见的服务器语言

Unity的开发语言

JSON

功能:

JSON最简单的格式

JSON工具

支持的数据结构(C#对于JSON)

字符含义

JSON的游戏中使用

Unity的JSON工具

类名:JsonUtility

序列化:ToJson()

反序列化:FromJson()

LitJson

列表

   字典

  列表嵌套类

数据表

修改JSON数据

XML

支持数据类型

XML规则

JSON和XML对比

作业:

请使用JSON完成注册和登录功能(JsonUtility实现,LitJson的JsonData实现,LitJson的List实现)

*JsonData

*JsonUtility


服务器

用来存储和处理数据的一台或一组电脑

常见的服务器语言

C++、Java、Nodejs(JavaScript)、PHP、Python、Go

Unity的开发语言

C#、Lua

JSON

全名:JavaScript Object Notation

功能:

JavaScript对象标记语言,是一种跨平台,跨语言,轻量级的数据交换和存储格式

JSON最简单的格式

JSON写法

{“Username”:”admin”,”Passward”:”123”}

C#

class OneRow

{

    public string Username;

    public string Password;

}

var obj = new OneRow();

obj.Username = "admin";

obj.Password = "123";

JSON工具

在线JSON校验格式化工具(Be JSON)

支持的数据结构(C#对于JSON)

数字型:short,int,long,float,double

字符串:”abc”,”你好”,’abc’

布尔:true,false

null:null

数组(列表):【值1,值2】

[1, 2, 3]

对象(字典):{“键1”:”值1”,”键2”:”值2”}

{

    "a": 1,

    "b": true,

    "c": "abc",

    "d": null,

    "e": [1, 2, 3]

}

Bit    0001

Byte      00000001    00000000~11111111

Ushort   0~65535

new List<int>() { 1, 2, 3 };  C#

new Dictionary<string, int> { { "a", 1 }, { "ab", 2 } }; C#

数组里套对象

字符含义

大括号组:对象,字典

中括号组:数组,列表

冒号:赋值,左侧是变量或键名称,右侧为值

逗号:元素分割符,最后一个元素后,没有逗号

双引号组:修饰变量(可以不加),表示string数据类型

单引号组:同双引号组

JSON的游戏中使用

存储在服务器中的数据

存储在策划配置的Excel中(Excel——>JSON)

将Excel中的数据导出为JSON

填写Excel数据

将Excel数据,导出为csv

通过文本编辑器,打开CSV内部内容,复制

将数据贴到转换工具上

分隔符表示,列间的分隔符,CSV列通过逗号分割,所以填写逗号

值全部使用字符串,不选,否则会影响C#数据类型,转换方式,按行转换对象(单元格数据和表头的列名产生赋值)

Unity的JSON工具

类名:JsonUtility

序列化:ToJson()

//使用Unity的内置JSON解析工具,将C#数据序列化为JSON字符串数据

//测试序列化(C#数据——>JSON数据)

[System.Serializable]

public class SubData

{ }

[System.Serializable]//类产生的对象数据,可以被序列化后存储

public class Data

{

    //数字型

    public int ID;

    //字符串型

    public string Name;

    //布尔型

    public bool IsStudent;

    //对象型

    public SubData Sub;

    //数组或列表

    public List<int> Numbers;

}

public class JsonEncode : MonoBehaviour

{

    // Start is called before the first frame update

    void Start()

    {

        var obj = new Data();

        obj.ID = 1;

        obj.Name = "abc";

        obj.IsStudent = true;

        obj.Sub = null;

        obj.Numbers = new List<int> { 1, 2, 3 };

        //将C#对象数据,转换为JSON字符串

        string json = JsonUtility.ToJson(obj);

        Debug.Log(json);

    }

}

注意:JSON最外层结构必须是对象结构

当一个类需要存储在另外一个成员变量中时,需要给类声明加特性

[System.Serializable]

存储游戏对象GameObject方法—存它的预制体,在JSON里存它的路径

————————————————————————————————————————

反序列化:FromJson()

//JSON格式存储的数据

Unity的JSON工具,解析JSON后,将数据存储在这个类型的对象中,因为JsonUtility.FromJson<T>()需要提供C#数据类型与JSON对应,所以需要在C#中定义数据类型

将j变量中存储的JSON结构,转化为C#的类型数据

//T:C#接收类型   参数:JSON字符串

public class ItemRow
{
    public int ID;
    public string Name;
    public string Description;
    public int Level;
    public int PriceType;
}
[System.Serializable]
public class ItemTable
{
    public List<ItemRow> Data;
}
public class JsonTable : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //加载JSON道具表的TextAsset
        TextAsset asset = Resources.Load<TextAsset>("Json/item");
        //获取内部文字
        string json = asset.text;
        Debug.Log(json);
        //解析JSON
        ItemTable d = JsonUtility.FromJson<ItemTable>(json);
        //Item表对象下Data成员变量下的第一条数据下的Name成员变量(羊刀)
        Debug.Log(d.Data[0].Name);
    }
}

LitJson

序列化

JsonMapper.ToJson()

反序列化

获得JsonData: JsonMapper.ToObject()

获得指定类型:JsonMapper.ToObject<T>()

注意:

反序列化不要求最外层是对象

对象内部存储对象不需要[System.Serializable]修饰Class

//引入LitJson命名空间

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using LitJson;

public class LitItemRow

{

    public int ID;

    public string Name;

    public string Description;

    public int Level;

    public int PriceType;

}

public class TestLitJson : MonoBehaviour

{

    // Start is called before the first frame update

    void Start()

    {

        //TestList();

        //TestDictionary();

        //TestListItemRow();

        //TestJsonData();

        TestToJson();

    }

列表

    public void TestList()

    {

        //加载JSON道具表的TextAsset

        TextAsset asset = Resources.Load<TextAsset>("Json/Lit_item");

        //获取内部文字

        string json = asset.text;

        Debug.Log(json);

        List<int> data = JsonMapper.ToObject<List<int>>(json);

        Debug.Log(data[0]);

}

   字典

public void TestDictionary()

    {

        //加载JSON道具表的TextAsset

        TextAsset asset = Resources.Load<TextAsset>("Json/dic");

        string json = asset.text;

        Dictionary<string, int> d = JsonMapper.ToObject<Dictionary<string, int>>(json);

        Debug.Log(d["a"]);

}

  列表嵌套类

  public void TestListItemRow()

    {

        TextAsset asset = Resources.Load<TextAsset>("Json/item");

        string json = asset.text;

        List<LitItemRow> d = JsonMapper.ToObject<List<LitItemRow>>(json);

        //也可以列表套字典,需要保证所有行中,键的类型一致,值的类型一致

        //List<Dictionary<string, string>> d1 = JsonMapper.ToObject<List<Dictionary<string, string>>>(json);

    }

数据表

    public void TestJsonData()

    {

        TextAsset asset = Resources.Load<TextAsset>("Json/item");

        string json = asset.text;

        JsonData d = JsonMapper.ToObject(json);

        //总的数据

        //一行数据

        JsonData row = d[2];

        Debug.Log(row["Description"]);

        //循环获取JsonData中的值

        for(int i=0;i<d.Count;i++)

        {

            Debug.Log((int)d[i]["ID"]);

            Debug.Log(d[i]["Name"].ToString());

        }

}

    public void TestToJson()

    {

        Debug.Log(JsonMapper.ToJson(new List<int>() { 111, 222, 333 }));

        Debug.Log(JsonMapper.ToJson(new Dictionary<string,int>() { {"aa",11 }, { "bb", 22 } }));

        JsonData data = new JsonData();

        data["user"] = "admin";

        data["id"] = 123;

        data["is_student"] = true;

        Debug.Log(data.ToJson());

    }

}

修改JSON数据

using System.IO;

using LitJson;

public class JsonChange : MonoBehaviour

{

    // Start is called before the first frame update

    void Start()

    {

        //Application应用的相关数据存储在内部

        //Unity开发的应用必定可写目录

        Debug.Log(Application.persistentDataPath);

        string path = Application.persistentDataPath + "/save.json";

        //C:/Users/lenovo1/AppData/LocalLow/DefaultCompany/JsonCode/save.json

        //检查文件是否存在

        if (!File.Exists(path))

        {

            //写入文件所有内容

            File.WriteAllText(path, "[1,2,3]");

        }

        else

        {

            //读取文件所有内容

            Debug.Log(File.ReadAllText(path));

            //JSON文件内容读取(JSON字符串)

            string content = File.ReadAllText(path);

            //JSON字符串解析为JsonData

            JsonData data = JsonMapper.ToObject(content);

            //修改第二条数据

            data[2] = 300;

            //最后将修改后的数据,再转换为JSON字符串,写入文件中

            File.WriteAllText(path, data.ToJson());

        }

    }

}

XML

全名:Extensible Markup Language

可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构体的标记语言

支持数据类型

数字,字符串,布尔,数组(链表),对象,null

示例

{

     "Username": "root",

     "Password": "123"

}

<?xml version=”1.0” encoding=”UTF-8”?>

<Root>

          <Username v=”123”>root</Username>

          <Password> 123</Password>

</Root>

友情提示:如果使用代码进行CSV文件转JSON文件,记得Excel导出的csv文件是GB2312的字符编码,转换前,需要将文件内容字符集转换为UTF-8

XML规则

所有XML元素都须有关闭标签

XML标签对大小写敏感

XML必须正确地嵌套

特殊字符

“<” =>“&It”         “>” => “&gt”

“&” => “&amp”       “’” => “&apos”

“”” => “&quot”

JSON和XML对比

JSON和XML可读性高

同样具有很强的扩展性

XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0

JSON相对于XML来讲,数据的体积小,传输和解析的速度更快

JSON不使用保留字

XML必须存在一个父节点

作业:

请使用JSON完成注册和登录功能(JsonUtility实现,LitJson的JsonData实现,LitJson的List实现)

*JsonData

//注册

publlic void RegisterClick()

{

        if(!File.Exists(Config._UserNumer))

        {

            //外层创建一个列表

            JsonData list = new JsonData();

            //一行数据

            JsonData row = new JsonData();

            row["Username"] = username;

            row["Password"] = password;

            //一行数列加入列表

            list.Add(row);

            //将列表写入JSON文件

            File.WriteAllText(Config._UserNumer, list.ToJson());

        }

        else

        {

            //读取原来数据

            string json = File.ReadAllText(Config._UserNumer);

            //解析JSON

            JsonData list = JsonMapper.ToObject(json);

            //去重复(遍历所有老数据的用户名,和新用户名进行对比,

            //如果发现用户名已经存在,应该给用户提示,并让用户修改)

            for (int i = 0; i < list.Count; i++)

            {

                if(username==list[i]["UserName"].ToString())

                {

                    Debug.Log("用户名已经存在");

                    return;

                }

            }

            //一行数据

            JsonData row = new JsonData();

            row["UserName"] = username;

            row["Password"] = password;

            //将新数据加入

            list.Add(row);

            //写入文件

            File.WriteAllText(Config._UserNumer, list.ToJson());

        }

}

//登录

public void LoginClick()
    {
        if(!File.Exists(Config._UserNumer))
        {
            Debug.Log("登录失败");
        }
        else
        {
            //读取文件内容
            string json = File.ReadAllText(Config._UserNumer);
            //解析为JsonData
            JsonData list = JsonMapper.ToObject(json);
            bool success = false;
            //遍历JsonData,检查是否存在用户名,且密码是否一致
            for (int i = 0; i < list.Count; i++)
            {
                if (username == list[i]["UserName"].ToString()&&password==list[i]["Password"].ToString())
                {
                    success = true;
                    break;
                }
            }
            if (success)
            {
                Debug.Log("登陆成功");
            }

            else
            {
                Debug.Log("登录失败");
            }
        }

*JsonUtility


[Serializable]
public class UserData
{
    [Serializable]
    public class Row
    {
        public string UserName;
        public string Password;       
    }
    public List<Row> Data;
}    

public void Register_JsonUtility()
    {
        if(!File.Exists(Config._UserNumer))
        {
            //创建对象
            UserData d = new UserData();
            //创建类的子类对象
            UserData.Row row = new UserData.Row();
            row.UserName = username;
            row.Password = password;
            d.Data = new List<UserData.Row>();
            d.Data.Add(row);
            //序列化
            string json = JsonUtility.ToJson(d);
            File.WriteAllText(Config._UserNumer, json);
        }
        else
        {
            //读取原来数据
            string json = File.ReadAllText(Config._UserNumer);
            //解析JSON
            UserData d = JsonUtility.FromJson<UserData>(json);
            for(int i=0;i<d.Data.Count;i++)
            {
                if (username == d.Data[i].UserName)
                {
                    Debug.Log("用户名存在");
                }
            }
            UserData.Row row = new UserData.Row();
            row.UserName = username;
            row.Password = password;
            //添加用户
            d.Data.Add(row);
            File.WriteAllText(Config._UserNumer, JsonUtility.ToJson(d));
        }
    }

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

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

相关文章

单片机stm32智能鱼缸

随着我国经济的快速发展而给人们带来了富足的生活&#xff0c;也有越来越多的人们开始养鱼&#xff0c;通过养各种鱼类来美化居住环境和缓解压力。但是在鱼类饲养过程中&#xff0c;常常由于鱼类对水质、水位及光照强度有着很高的要求&#xff0c;而人们也由于工作的方面而无法…

2023年12月CCF-GESP编程能力等级认证C++编程四级真题解析

一、单选题(共15题,共30分) 第1题 下面有关函数参数的说法,正确的是( )。 A:函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子函数将参数值改变,主函数当中的参数值不变。 B:函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子…

jvm垃圾收集器-三色标记算法

1.对象已死吗? 在堆里面存放着Java世界中几乎所有的对象实例&#xff0c;垃圾收集器在对堆进行回收前&#xff0c;第一件事情就是要确定这些对象之中哪些还“存活”着&#xff0c;哪些已经“死去”&#xff08;即不可能再被任何途径使用的对象). 引计数法 引用计数算法是一…

【快速搞定Webpack5】基本配置及开发模式介绍(二)

在开始使用webpack之前么&#xff0c;我们需要对Webpack的配置有一定的认识。 一、5大核心概念 1. enty&#xff08;入口&#xff09; 指示webpack从哪个文件开始打包 2. output&#xff08;输出&#xff09; 指示webpack打包完的文件输出到哪里去&#xff0c;如何命名等 …

适配器模式:转换接口,无缝对接不同系统

文章目录 **一、技术背景与应用场景****为什么使用适配器模式&#xff1f;****典型应用场景包括但不限于&#xff1a;** **二、适配器模式定义与结构****三、使用步骤举例****四、优缺点分析****总结** 一、技术背景与应用场景 适配器模式在软件设计中扮演着桥梁角色&#xff…

Linux(五)__系统管理

介绍 通常&#xff0c; Windows 中使用"任务管理器"主要有 3 个目的&#xff1a; 利用"应用程序"和"进程"标签来査看系统中到底运行了哪些程序和进程&#xff1b;利用"性能"和"用户"标签来判断服务器的健康状态&#xff1…

vue项目调用摄像头实现拍照功能

目录 1.功能需求 2.API 3.完整代码 4.效果 5.遇到问题 1.功能需求 需求:下面需求图 本来应该使用小程序做&#xff0c;但是为了以后复用考虑&#xff0c;决定使用vue嵌入小程序中。 所以需求就是 调用手机摄像头 实现拍照打卡功能&#xff08;电脑通用&#xff09; 2.API …

【Redis】Redis的数据分布算法

一共有五种算法&#xff0c;分别为&#xff1a;哈希算法、一致性哈希算法、带有限负载的一致性哈希算法、虚拟节点一致性哈希算法、虚拟槽分区 哈希算法 思想&#xff1a;根据某个key的值或者key 的哈希值与当前可用的 master 节点数取模&#xff0c;根据取模的值获取具体的服…

halcon 标定多元点标定板、棋盘格映射矫正图像、矫正失真图像

一、标定多圆孔标定 其理论与棋盘格 和圆孔都是一样的&#xff0c;不一样的地方就是定方向的方式不一样。如图 2、结果 read_image (CalibImage, ./circle/1.png) get_image_size (CalibImage, Width, Height) dev_close_window () dev_open_window_fit_image (CalibImage, 0…

“成像光谱遥感技术中的AI革命:ChatGPT应用指南“

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本课程重点介绍ChatGPT在遥感中的应用&#xff0c;人工智…

2024牛客寒假算法基础集训营4(视频讲解题目)

2024牛客寒假算法基础集训营4&#xff08;视频讲解题目&#xff09; 视频链接ABCDEFG、H&#xff08;下面是hard版本的代码两个都可以过&#xff09; 视频链接 2024牛客寒假算法基础集训营4&#xff08;视频讲解题目&#xff09; A #include<bits/stdc.h> #define en…

C++:C++入门基础

创作不易&#xff0c;感谢三连 &#xff01;&#xff01; 一、什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff…

第100讲:MHA+Atlas实现MySQL主从复制读写分离分布式集群

文章目录 1.Atlas读写分离简介2.搭建MHA高可用MySQL主从复制集群3.部署配置Atlas读写分离中间件3.1.安装Atlas读写分离中间件3.2.配置读写分离3.3.启动Atlas读写分离 4.读写分离集群测试5.生产环境中创建一个用户通过Atlas使用6.Atlas通过管理接口实现在线管理7.Atlas自动分表 …

华为OD机试真题-开源项目热榜-2023年OD统一考试(C卷)---python免费

题目&#xff1a; 考察内容&#xff1a; 理解题目双排序 代码&#xff1a; """ 题目分析&#xff1a; 计算热度值&#xff0c;进行降序排序&#xff0c;热度值一样&#xff0c;字母小写&#xff0c;字典排序输入&#xff1a; 项目个数N, int 0-100 权重列表…

快速部署华为云WAF实现Web应用安全防护

通常&#xff0c;用户将web应用暴露在公网上&#xff0c;不做任何准备或者安全措施可能会受到黑客的注入入侵攻击导致网站核心数据被脱库泄露。以及木马上传网页篡改&#xff0c;导致网站公信力受到影响。本文九河云将为您介绍如何通过华为云WAF应用防火墙实现web应用安全防护&…

解锁创意灵感,探索FlutterExampleApps项目的奥秘

解锁创意灵感&#xff0c;探索FlutterExampleApps项目的奥秘 项目简介 FlutterExampleApps项目是一个包含各种示例应用链接的仓库&#xff0c;旨在演示Flutter应用开发中的各种功能、特性和集成。 项目包含了以下几个部分&#xff0c;每个部分都涵盖了不同的内容和主题&…

Day23--learning English

一、积累 1.straw 2.umami | tangy | bland 3.lactose dairy 4.fatigue 5.stumble | curb 6.pore 7.toll 8.arrear 9.robe 10.stylish 11.dash 12.mischief 13.ranch 14.sponsorship 15.podcast 16.villian 17.clutch 18.envision 二、练习 1.牛津原译 1.straw /strɔː/ 1…

pytorch数学运算

目录 1. pytorch的数学运算包括2. 基本运算3. matmul4. power sqrt rsqrt5. exp log6. 近似值7. clamp 1. pytorch的数学运算包括 ▪Add/minus/multiply/divide ▪Matmul ▪Pow ▪Sqrt/rsqrt ▪Round 2. 基本运算 、-、*、/ 也可以使用函数add sub mul div 3. matmul 矩阵…

ipad作为扩展屏的最简单方式(无需数据线)

ipad和win都下载安装toDesk&#xff0c;并且都处于同一局域网下 连接ipad&#xff0c;在ipad中输入win设备的设备密码和临时密码&#xff0c;连接上后可以看到ipad会是win屏幕的镜像&#xff0c;此时退出连接&#xff0c;准备以扩展模式再次连接。 注意&#xff0c;如果直接从…

keepalived双活互备模式测试

文章目录 环境准备部署安装keepavlived配置启动测试模拟Nginx宕机重新启动问题分析 环境准备 测试一下keepalived的双主模式&#xff0c;所谓双主模式就是两个keepavlied节点各持有一个/组虚IP&#xff0c;默认情况下&#xff0c;二者互为主备&#xff0c;同时对外提供服务&am…