Unity-基于JsonUtility的Json文件读写
前言
在 Unity 开发中,配置存档、参数、UI 状态、参数保存,几乎都离不开 JSON 读写。
Unity 自带JsonUtility,原生、轻量、跨平台、打包无报错、零依赖。
本篇给大家一套全网最简、可直接商用的 JSON 读写模板,包含:
✅ 单数据读写
✅ List 列表读写
✅ 通用工具类(全局一行调用)
✅ 所有坑点完整避坑
✅ 适配编辑器 + 打包 Windows/安卓
一、核心原理(必看)
1. 核心 API
JsonUtility.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 SaveJson<T>(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 LoadJson<T>(string path) { if (!File.Exists(path)) { Debug.LogWarning("JSON文件不存在"); return default; } string json = File.ReadAllText(path); return JsonUtility.FromJson<T>(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.LoadJson<PlcConfigData>(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 List<PlcConfigData> 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 List<PlcConfigData>(); wrap.DataList.Add(new PlcConfigData() { Ip = "192.168.0.2", Rack = 0, Slot = 2 }); JsonTool.SaveJson(wrap, SavePath); // 读取列表 DataListWrapper loadWrap = JsonTool.LoadJson<DataListWrapper>(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.Json
5. 不要用 dataPath 存档
dataPath打包后只读,必须用persistentDataPath
六、优缺点总结
✅ 优点
零插件、原生自带
跨平台 Windows / Android / IOS
速度快、轻量、无冲突
工业仿真、PLC项目、工具项目完全够用
❌ 缺点
不支持顶层数组
不支持 Dictionary
结语
90% 的 Unity 存档、配置需求,原生 JsonUtility 完全够用,不需要第三方插件。
本文这套工具类是最简、最稳通用模板。
