Unity-基于JsonUtility的Json文件读写

发布时间:2026/8/4 18:31:26
Unity-基于JsonUtility的Json文件读写 前言在 Unity 开发中配置存档、参数、UI 状态、参数保存几乎都离不开 JSON 读写。Unity 自带JsonUtility原生、轻量、跨平台、打包无报错、零依赖。本篇给大家一套全网最简、可直接商用的 JSON 读写模板包含✅ 单数据读写✅ List 列表读写✅ 通用工具类全局一行调用✅ 所有坑点完整避坑✅ 适配编辑器 打包 Windows/安卓一、核心原理必看1. 核心 APIJsonUtility.ToJson()对象转 JSON 字符串保存JsonUtility.FromJson()JSON 字符串转对象读取2. 三条铁律99%报错的原因数据类必须加[Serializable]字段必须是public原生不支持直接 数组/List 顶层 JSON需要包装类二、最简完整代码可直接复制使用1. 数据模型类示例PLC配置using System; /// summary /// 可序列化的JSON数据模型 /// /summary [Serializable] public class PlcConfigData { public string Ip; public int Rack; public int Slot; public float Speed; public bool IsConnected; }2. 通用 JSON 工具类全局通用静态工具类项目放任意位置整项目通用。using UnityEngine; using System.IO; /// summary /// Unity 原生JSON读写工具类 /// /summary public static class JsonTool { /// summary /// 保存数据到JSON文件 /// /summary public static void SaveJsonT(T data, string path) { string json JsonUtility.ToJson(data, prettyPrint: true); File.WriteAllText(path, json); Debug.Log($JSON保存成功{path}); } /// summary /// 读取JSON文件 /// /summary public static T LoadJsonT(string path) { if (!File.Exists(path)) { Debug.LogWarning(JSON文件不存在); return default; } string json File.ReadAllText(path); return JsonUtility.FromJsonT(json); } }3. 调用示例一行保存、一行读取using UnityEngine; using System.IO; public class JsonTest : MonoBehaviour { // 持久化路径编辑器 打包通用 private string SavePath Path.Combine(Application.persistentDataPath, plcConfig.json); void Start() { // 1. 构造测试数据 PlcConfigData data new PlcConfigData() { Ip 192.168.0.1, Rack 0, Slot 1, Speed 35.5f, IsConnected false }; // 2. 保存JSON JsonTool.SaveJson(data, SavePath); // 3. 读取JSON PlcConfigData load JsonTool.LoadJsonPlcConfigData(SavePath); if (load ! null) { Debug.Log(读取IP load.Ip); Debug.Log(读取速度 load.Speed); } } }保存示例读取示例注意在Unity中脚本要能拖拽到游戏对象上需满足继承自MonoBehaviour这一硬性条件而要在Inspector中拖拽赋值字段则需要该字段为public或标记[SerializeField]。三、List/数组 列表数据读写高频需求重点坑Unity Json 不支持直接序列化 List 顶层对象解决方案外层套一个包装类1. 列表包装类using System; using System.Collections.Generic; [Serializable] public class DataListWrapper { public ListPlcConfigData DataList; }2. 列表保存读取示例using System.Collections.Generic; using System.IO; using UnityEngine; public class JsonTest : MonoBehaviour { // 持久化路径编辑器 打包通用 private string SavePath Path.Combine(Application.persistentDataPath, plcConfigList.json); void Start() { // 保存列表 DataListWrapper wrap new DataListWrapper(); wrap.DataList new ListPlcConfigData(); wrap.DataList.Add(new PlcConfigData() { Ip 192.168.0.2, Rack 0, Slot 2 }); JsonTool.SaveJson(wrap, SavePath); // 读取列表 DataListWrapper loadWrap JsonTool.LoadJsonDataListWrapper(SavePath); if (loadWrap ! null) { foreach (var item in loadWrap.DataList) { Debug.Log(item.Ip); } } } }保存示例读取示例四、JSON 文件位置在哪里编辑器路径C:\Users\你的用户名\AppData\LocalLow\公司名\项目名\AppData 是隐藏文件夹直接粘贴地址回车即可打开。五、全网最齐全的踩坑总结1. 类没有加 [Serializable]现象生成空 JSON{}读取全部为空、不报错解决必须加序列化特性2. 字段写成 private私有字段无法序列化JSON 不显示3. 保存立刻读取偶尔读不到磁盘写入延迟解决方案协程延迟读取4. 不能直接存 Dictionary原生不支持字典需要用 List 替代或 Newtonsoft.Json5. 不要用 dataPath 存档dataPath打包后只读必须用persistentDataPath六、优缺点总结✅ 优点零插件、原生自带跨平台 Windows / Android / IOS速度快、轻量、无冲突工业仿真、PLC项目、工具项目完全够用❌ 缺点不支持顶层数组不支持 Dictionary结语90% 的 Unity 存档、配置需求原生 JsonUtility 完全够用不需要第三方插件。本文这套工具类是最简、最稳通用模板。