当前位置: 首页 > news >正文

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是一个开源免费的数据可视化分析平台&#xff0c;企业版在开源版基础上开发&#xff0c;新增了诸多企业级特性&#xff0c;包括&#xff1a;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 是网易游戏推出的一款自动化测试框架&#xff0c;其项目由以下几个部分构成 Airtest : 一个跨平台的&#xff0c;基于图像识别的 UI 自动化测试框架&#xff0c;适用于游戏和 App &#xff0c; 支持 Windows, Android 和 iOS 平台&#xff0c…...

Android更改包名和签名

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

tortoisegit下载及其使用流程

下载 官方下载链接&#xff1a;Download – TortoiseGit – Windows Shell Interface to Git 选择适合自己的电脑位数的版本&#xff1a;一般64的兼容32的 按照就不介绍了怎么开心怎么来&#xff0c;本篇暂时为了支持一位粉丝的疑惑 安装的话没有特殊配置暂不介绍&#xff0c…...

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, 这篇论文采用的是一种动态分辨率的输入&#xff1b; 全图有一个global view,resize到336*336&#xff1b; 然后把图片resize再pad…...

兼容并蓄,高效集成:EasyCVR视频综合接入能力助力多元化项目需求

随着视频技术的不断进步&#xff0c;视频监控、视频直播、执法记录仪、语音可视对讲、无人机等视频资源的应用场景日益丰富。这些视频资源不仅在数量上快速增长&#xff0c;而且在质量、格式、编码标准等方面也呈现出多样化的特点。因此&#xff0c;为了有效整合这些资源&#…...

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&#xff…...

LCD 显示字符

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

NOI2003 逃学的小孩 题解

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

硬件服务器操作系统的选择:Linux 还是 Windows?

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

dataV组件使用——数据更新更新组件

bug 当数据更新只更新一个属性页面不会刷新&#xff08;this.config1.data arr;&#xff09; 必须重新赋值整个config 方式一&#xff1a;检测到数据更新重新赋值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#写到代码&#xff0c;看来网上写的方法&#xff0c;自己也踩了一些坑&#xff0c;这里总结一下&#xff0c;我只试了CLR的方法。 主要参考了下面几篇博客 C调用C#库简单例程&#xff08;Lucky…...

开源前端埋点监控插件Web-Tracing

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

智慧排水远程监测系统物联网解决方案

智慧排水监测系统是一种集成了现代信息技术、物联网技术、大数据分析及云计算能力的高效城市排水管理解决方案。该系统通过全面、实时地监控城市排水网络的运行状态&#xff0c;旨在预防内涝灾害&#xff0c;优化水资源管理&#xff0c;保障城市安全运行&#xff0c;促进可持续…...

【SVN(Subversion)是一个版本控制系统】

Question SVN所有命令 Answer SVN&#xff08;Subversion&#xff09;是一个版本控制系统&#xff0c;用于管理和跟踪文件和目录的更改。以下是一些常用的SVN命令&#xff1a; 检出&#xff08;Checkout&#xff09; svn checkout URL从版本库中检出一个工作副本。 更新&am…...

leetcode108.把升序数组转换成二叉搜索树

题目描述 [-10,-3,0,5,9] 转换成如下二叉搜索树&#xff1a; 解题的核心原理是&#xff1a;二叉搜索树的中序遍历结果是一个升序数组&#xff0c;所以根节点的数值&#xff0c;也位于数组的中部。 class Solution {public TreeNode sortedArrayToBST(int[] nums) {return h…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

抽象类和接口(全)

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

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数&#xff0c;如果我们没有定义实现某个中断函数&#xff0c;那么当stm32产生了该中断时&#xff0c;就会默认跑这里来了&#xff0c;所以我们打开了什么中断&#xff0c;一定要记得实现对应的系统中断函数&#xff0c;否则会进来一直循环…...