unity json 处理
1. c#对象 -> json
public class Item
{public int id;public int num;public Item(int id, int num){this.id = id;this.num = num;}
}
public class PlayerInfo
{public string name;public int atk;public int def;public float moveSpeed;public double roundSpeed;public Item weapon;public List<int> listInt;public List<Item> itemList;public Dictionary<int, Item> itemDic;public Dictionary<string, Item> itemDic2;private int privateI = 1;protected int protectedI = 2;
}
{"name":“abc”,"atk": 10,"def":3,"moveSpeed": 1.4,"roundSpeed": 1.4,"weapon": {"id": 1, "num": 13,"listInt": [1,2,3,4,51,"itemList": [{"id":2, "num": 10},{"id":3, "num": 99},{"id":4, "num":55}],"itemDic" { "2":{"id":2, "num": 1},"3": {"id":3, "num": 10}},"itemDic2": {"2": {"id":2, "num": 1}},"privatel":1,"protectedI": 99
}
字典的话:键会变成双引号。
2、JsonUtility的使用
2.1 作用
JsonUtlity 是Unity自带的用于解析Json的公共类
1.将内存中对象序列化为Json格式的字符串
2.将Json字符串反序列化为类对象
2.2 特点
注意:
1.float序列化时看起来会有一些误差
2.自定义类需要加上序列化特性[System.Serializable]
3.想要序列化私有变量 需要加上特性[SerializeField]
4.JsonUtility不支持字典
5.JsonUtlity存储null对象不会是null 而是默认值的数据 ,例如int类型的就是0
2.3 代码
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;[System.Serializable]
public class Student
{public int age;public string name;public Student(int age, string name){this.age = age;this.name = name;}
}
/// <summary>
/// 这个不用加序列化是因为它是被直接进行序列化的,属于第一层,但是内部的Student就需要特别处理下了
/// </summary>
public class MrTang
{public string name;public int age;public bool sex;public float testF;public double testD;public int[] ids;public List<int> ids2;public Dictionary<int, string> dic;public Dictionary<string, string> dic2;public Student s1;public List<Student> s2s;//除了public类型之外的都需要加这个才会被序列化[SerializeField]private int privateI = 1;[SerializeField]protected int protectedI = 2;
}public class RoleData
{public List<RoleInfo> list;
}
//如果这个类不是在Json直接转化的第一层对象,是对象内的对象,那么就需要加一个这个,不然不会被序列化
[System.Serializable]
public class RoleInfo
{public int hp;public int speed;public int volume;public string resName;public int scale;
}public class JsonManager : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){#region 知识点一 JsonUtlity是什么?//JsonUtlity 是Unity自带的用于解析Json的公共类//它可以//1.将内存中对象序列化为Json格式的字符串//2.将Json字符串反序列化为类对象#endregion#region 知识点二 必备知识点——在文件中存读字符串//1.存储字符串到指定路径文件中//第一个参数 填写的是 存储的路径//第二个参数 填写的是 存储的字符串内容//注意:第一个参数 必须是存在的文件路径 如果没有对应文件夹 会报错File.WriteAllText(Application.persistentDataPath + "/Test.json", "唐老狮存储的json文件");print(Application.persistentDataPath);//2.在指定路径文件中读取字符串string str = File.ReadAllText(Application.persistentDataPath + "/Test.json");print(str);#endregion#region 知识点三 使用JsonUtlity进行序列化//序列化:把内存中的数据 存储到硬盘上//方法://JsonUtility.ToJson(对象)MrTang t = new MrTang();t.name = "abc";t.age = 18;t.sex = false;t.testF = 1.4f;t.testD = 1.4;t.ids = new int[] { 1, 2, 3, 4 };t.ids2 = new List<int>() { 1, 2, 3 };t.dic = new Dictionary<int, string>() { { 1, "123" }, { 2, "234" } };t.dic2 = new Dictionary<string, string>() { { "1", "123" }, { "2", "234" } };t.s1 = null;//new Student(1, "小红");t.s2s = new List<Student>() { new Student(2, "小明"), new Student(3, "小强") };//Jsonutility提供了线程的方法 可以把类对象 序列化为 json字符串string jsonStr = JsonUtility.ToJson(t);File.WriteAllText(Application.persistentDataPath + "/MrTang.json", jsonStr);#endregion#region 知识点四 使用JsonUtlity进行反序列化//反序列化:把硬盘上的数据 读取到内存中//方法://JsonUtility.FromJson(字符串)//读取文件中的 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中数据少了,读取到内存中类对象中时不会报错#endregion#region 知识点五 注意事项//1.JsonUtlity无法直接读取数据集合,如果json中是以[]开始的,那么就会报错,必须要在多裹一层,想要解决就需要下面那种方法,在代码内多套一层jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/RoleInfo2.json");print(jsonStr);//List<RoleInfo> roleInfoList = JsonUtility.FromJson<List<RoleInfo>>(jsonStr);RoleData data = JsonUtility.FromJson<RoleData>(jsonStr);//2.文本编码格式需要时UTF-8 不然无法加载#endregion#region 总结//1.必备知识点 —— File存读字符串的方法 ReadAllText和WriteAllText//2.JsonUtlity提供的序列化反序列化方法 ToJson 和 FromJson//3.自定义类需要加上序列化特性[System.Serializable]//4.私有保护成员 需要加上[SerializeField]//5.JsonUtlity不支持字典//6.JsonUtlity不能直接将数据反序列化为数据集合//7.Json文档编码格式必须是UTF-8#endregion}// Update is called once per framevoid Update(){}
}
– json文件
{"list":[{"hp":4,"speed":6,"volume":5,"resName":"Airplane/Airplane1","scale":15},{"hp":3,"speed":7,"volume":4,"resName":"Airplane/Airplane2","scale":15},{"hp":2,"speed":8,"volume":3,"resName":"Airplane/Airplane3","scale":15},{"hp":10,"speed":3,"volume":10,"resName":"Airplane/Airplane4","scale":6},{"hp":6,"speed":5,"volume":7,"resName":"Airplane/Airplane5","scale":10}]
}
3、LitJson的使用
3.1 作用
它是一个第三方库,用于处理Json的序列化和反序列化
LitJson是C#编写的,体积小、速度快、易于使用
它可以很容易的嵌入到我们的代码中
只需要将LitJson代码拷贝到工程中即可
1.前往LitJson官网
2.通过官网前往GitHub获取最新版本代码
3.将代码(src里面的那个即如下图,多余的删除即可)拷贝到Unity工程中 即可开始使用LitJson
using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;public class Student2
{public int age;public string name;public Student2() { }public Student2(int age, string name){this.age = age;this.name = name;}
}public class MrTang2
{public string name;public int age;public bool sex;public float testF;public double testD;public int[] ids;public List<int> ids2;//public Dictionary<int, string> dic;public Dictionary<string, string> dic2;public Student2 s1;public List<Student2> s2s;private int privateI = 1;protected int protectedI = 2;
}public class RoleInfo2
{public int hp;public int speed;public int volume;public string resName;public int scale;
}public class LitJsonTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){#region 知识点一 LitJson是什么?//它是一个第三方库,用于处理Json的序列化和反序列化//LitJson是C#编写的,体积小、速度快、易于使用//它可以很容易的嵌入到我们的代码中//只需要将LitJson代码拷贝到工程中即可#endregion#region 知识点二 获取LitJson//1.前往LitJson官网//2.通过官网前往GitHub获取最新版本代码//3.讲代码拷贝到Unity工程中 即可开始使用LitJson#endregion#region 知识点三 使用LitJson进行序列化//方法://JsonMapper.ToJson(对象)MrTang2 t = new MrTang2();t.name = "abc";t.age = 18;t.sex = true;t.testF = 1.4f;t.testD = 1.4;t.ids = new int[] { 1, 2, 3, 4 };t.ids2 = new List<int>() { 1, 2, 3 };//t.dic = new Dictionary<int, string>() { { 1, "123" }, { 2, "234" } };t.dic2 = new Dictionary<string, string>() { { "1", "123" }, { "2", "234" } };t.s1 = null;//new Student(1, "小红");t.s2s = new List<Student2>() { new Student2(2, "小明"), new Student2(3, "小强") };string jsonStr = JsonMapper.ToJson(t);print(Application.persistentDataPath);File.WriteAllText(Application.persistentDataPath + "/MrTang2.json", jsonStr);//注意://1.相对JsonUtlity不需要加特性//2.不能序列化私有变量//3.支持字典类型,字典的键 建议都是字符串 因为 Json的特点 Json中的键会加上双引号//4.需要引用LitJson命名空间//5.LitJson可以准确的保存null类型#endregion#region 知识点四 使用LitJson反序列化//方法://JsonMapper.ToObject(字符串)jsonStr = File.ReadAllText(Application.persistentDataPath + "/MrTang2.json");//JsonData是LitJson提供的类对象 可以用键值对的形式去访问其中的内容JsonData data = JsonMapper.ToObject(jsonStr);print(data["name"]);print(data["age"]);//通过泛型转换 更加的方便 建议使用这种方式MrTang2 t2 = JsonMapper.ToObject<MrTang2>(jsonStr);print(t2.name);print(t2.age);//注意://1.类结构需要无参构造函数,否则反序列化时报错//2.字典虽然支持 但是键在使用为数值时会有问题 需要使用字符串类型#endregion#region 知识点五 注意事项//1.LitJson可以直接读取数据集合// jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/RoleInfo.json");jsonStr = File.ReadAllText(Application.persistentDataPath + "/RoleInfo2.json");print(jsonStr);RoleInfo2[] arr = JsonMapper.ToObject<RoleInfo2[]>(jsonStr);print(arr[0].hp);// 这个需要在json外层List<RoleInfo2> list = JsonMapper.ToObject<List<RoleInfo2>>(jsonStr);// jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/Dic.json");// Dictionary<string, int> dicTest = JsonMapper.ToObject<Dictionary<string, int>>(jsonStr);//2.文本编码格式需要是UTF-8 不然无法加载#endregion#region 总结//1.LitJson提供的序列化反序列化方法 JsonMapper.ToJson和ToObject<>//2.LitJson无需加特性//3.LitJson不支持私有变量//4.LitJson支持字典序列化反序列化//5.LitJson可以直接将数据反序列化为数据集合//6.LitJson反序列化时 自定义类型需要无参构造//7.Json文档编码格式必须是UTF-8#endregion}// Update is called once per framevoid Update(){}
}
4. JsonMgr.cs json管理类
using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;/// <summary>
/// 序列化和反序列化Json时 使用的是哪种方案
/// </summary>
public enum JsonType
{JsonUtlity,LitJson,
}/// <summary>
/// Json数据管理类 主要用于进行 Json的序列化存储到硬盘 和 反序列化从硬盘中读取到内存中
/// </summary>
public class JsonMgr
{private static JsonMgr instance = new JsonMgr();public static JsonMgr Instance => instance;private JsonMgr() { }//存储Json数据 序列化public void SaveData(object data, string fileName, JsonType type = JsonType.LitJson){//确定存储路径string path = Application.persistentDataPath + "/" + fileName + ".json";//序列化 得到Json字符串string jsonStr = "";switch (type){case JsonType.JsonUtlity:jsonStr = JsonUtility.ToJson(data);break;case JsonType.LitJson:jsonStr = JsonMapper.ToJson(data);break;}//把序列化的Json字符串 存储到指定路径的文件中File.WriteAllText(path, jsonStr);}//读取指定文件中的 Json数据 反序列化public T LoadData<T>(string fileName, JsonType type = JsonType.LitJson) where T : new(){//确定从哪个路径读取//首先先判断 默认数据文件夹中是否有我们想要的数据 如果有 就从中获取string path = Application.streamingAssetsPath + "/" + fileName + ".json";//先判断 是否存在这个文件//如果不存在默认文件 就从 读写文件夹中去寻找if(!File.Exists(path))path = Application.persistentDataPath + "/" + fileName + ".json";//如果读写文件夹中都还没有 那就返回一个默认对象if (!File.Exists(path))return new T();//进行反序列化string jsonStr = File.ReadAllText(path);//数据对象T data = default(T);switch (type){case JsonType.JsonUtlity:data = JsonUtility.FromJson<T>(jsonStr);break;case JsonType.LitJson:data = JsonMapper.ToObject<T>(jsonStr);break;}//把对象返回出去return data;}
}
相关文章:

unity json 处理
1. c#对象 -> json public class Item {public int id;public int num;public Item(int id, int num){this.id id;this.num num;} } public class PlayerInfo {public string name;public int atk;public int def;public float moveSpeed;public double roundSpeed;publi…...

如何使用DataGear零编码快速制作MQTT物联网实时数据看板
DataGear是一个开源免费的数据可视化分析平台,企业版在开源版基础上开发,新增了诸多企业级特性,包括:MySQL及更多部署数据库支持、MQTT/WebSocket/Redis/MongoDB数据集、OAuth2.0/CAS/JWT/LDAP统一登录支持、前后端敏感信息加密传…...

Mysql查询日志
Mysql查询日志 Mysql查询日志默认是关闭状态的。 mysql> show variables like %general_log%; --------------------------------------- | Variable_name | Value | --------------------------------------- | general_log | OFF …...

Airtest 的使用
Airtest 介绍 Airtest Project 是网易游戏推出的一款自动化测试框架,其项目由以下几个部分构成 Airtest : 一个跨平台的,基于图像识别的 UI 自动化测试框架,适用于游戏和 App , 支持 Windows, Android 和 iOS 平台,…...

Android更改包名和签名
一、更改包名 1、包名——鼠标右键——Refactor——Rename 修改自己想更改的包名和选择更改范围后点击Refactor就可以了 2.手动修改app的build.gradle文件中的applicationId(改成和我们之前修改的包名相同) 3.修改AndroidManifest.xml文件中的packag…...

tortoisegit下载及其使用流程
下载 官方下载链接:Download – TortoiseGit – Windows Shell Interface to Git 选择适合自己的电脑位数的版本:一般64的兼容32的 按照就不介绍了怎么开心怎么来,本篇暂时为了支持一位粉丝的疑惑 安装的话没有特殊配置暂不介绍,…...
Anrdoir 13 关于设置静态IP后,突然断电,在上电开机卡动画
bug描述:设置静态IP成功后,机器突然断电,然后在上电开机,发现机器一直卡在开机动画,无法成功进入桌面 第一时间抓取日志分析,Log如下: 08-13 11:26:42.455 2803 2803 I EthernetServiceImpl: Starting Ethernet service 08-13 11:26:42.457 2803 2924 D ConnectivityServ…...

multimodel ocr dataset
InternLM-XComposer2-4KHD InternLM-XComposer2-4KHD a light-weight Vision Encoder OpenAI ViT-Large/14Large Language Model InternLM2-7B, 这篇论文采用的是一种动态分辨率的输入; 全图有一个global view,resize到336*336; 然后把图片resize再pad…...

兼容并蓄,高效集成:EasyCVR视频综合接入能力助力多元化项目需求
随着视频技术的不断进步,视频监控、视频直播、执法记录仪、语音可视对讲、无人机等视频资源的应用场景日益丰富。这些视频资源不仅在数量上快速增长,而且在质量、格式、编码标准等方面也呈现出多样化的特点。因此,为了有效整合这些资源&#…...

linux 部署YUM仓库及NFS共享服务
目录 简介 一、YUM仓库服务 1.1 YUM概述 1.2 linux系统各家厂家用的安装源 1.3 yum命令 1.4 yum下载方式 1.5 部署YUM软件仓库 二、NFS共享存储服务 2.1 NFS共享存储服务概念 2.2 NFS配置环境 2.3 使用NFS发布共享资源 2.4 在客户端访问NFS共享 简介 yumÿ…...

LCD 显示字符
1.0 字符显示 使用显示图片的方式显示字符会浪费存储空间,显示字符的时候字符的笔画是一个固定的颜色,因此不用使用显示图片的方式,可以使用1 表示字符的本身,0 表示字符的背景,使用这种方式显示字符节省存储空间。 注…...

NOI2003 逃学的小孩 题解
NOI2003 逃学的小孩 题解 传送门。 题目简述 给定一棵树 T T T,需要选择三个点 A , B , C A,B,C A,B,C,需要从 C C C 走到 A , B A,B A,B 的最远距离。 (第一段题目是在讲剧情吗。。) 前置知识 图树树的直径 思路简…...

硬件服务器操作系统的选择:Linux 还是 Windows?
在这个科技日新月异的时代,云服务器虽然日益普及,但硬件服务器依然是众多云服务和数据中心不可或缺的基石。有趣的是,随着云服务器的兴起,不少工程师竟然未曾亲眼见过实体的硬件服务器。然而,事实是,无论是…...

dataV组件使用——数据更新更新组件
bug 当数据更新只更新一个属性页面不会刷新(this.config1.data arr;) 必须重新赋值整个config 方式一:检测到数据更新重新赋值config this.config1 {data: arr,header: ["所在单位", "人员姓名", "职位", &q…...
solana合约编写
文章目录 solana 合约编写整体思路Cargo.toml配置代码实现在 Solana 智能合约中,定义和管理可能的错误类型自定义一个 Solana 账户结构一个帐户的约束条件什么是bump账号获取指令参数编码基础常用总结format! 格式化字符串Option<String>Vec<u8>编译部署到localne…...

C++调用C#方法(附踩坑点)
C调用C#方法 写在前面效果思路步骤可能的问题 写在后面 写在前面 工作需要用C调用C#写到代码,看来网上写的方法,自己也踩了一些坑,这里总结一下,我只试了CLR的方法。 主要参考了下面几篇博客 C调用C#库简单例程(Lucky…...

开源前端埋点监控插件Web-Tracing
Web-Tracing是一款专为前端项目设计的前端监控插件,它基于JavaScript设计,兼容跨平台使用,并提供了全方位的监控功能。 开源地址:https://gitee.com/junluoyu/web-tracing-analysis 以下是关于Web-Tracing的详细介绍:…...

智慧排水远程监测系统物联网解决方案
智慧排水监测系统是一种集成了现代信息技术、物联网技术、大数据分析及云计算能力的高效城市排水管理解决方案。该系统通过全面、实时地监控城市排水网络的运行状态,旨在预防内涝灾害,优化水资源管理,保障城市安全运行,促进可持续…...
【SVN(Subversion)是一个版本控制系统】
Question SVN所有命令 Answer SVN(Subversion)是一个版本控制系统,用于管理和跟踪文件和目录的更改。以下是一些常用的SVN命令: 检出(Checkout) svn checkout URL从版本库中检出一个工作副本。 更新&am…...

leetcode108.把升序数组转换成二叉搜索树
题目描述 [-10,-3,0,5,9] 转换成如下二叉搜索树: 解题的核心原理是:二叉搜索树的中序遍历结果是一个升序数组,所以根节点的数值,也位于数组的中部。 class Solution {public TreeNode sortedArrayToBST(int[] nums) {return h…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...

密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...