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…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...
CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...
git删除本地分支和远程分支
删除本地分支 git branch -d 分支名删除远程分支 git push origin --delete 分支名...
