Unity/C#中如何存储字典嵌套字典(兼容Python JSON生成)
解决Unity中解析Python生成的嵌套字典JSON的简单方案
你遇到的问题很常见,Unity原生JsonUtility确实不支持字典类型,但有几个简单的解决思路,不用复杂的自定义库:
方案1:调整Python输出的JSON结构,适配Unity原生序列化
不用改Unity端的复杂逻辑,只在Python端把嵌套字典转成数组结构,让Unity可以用普通类数组解析,之后再转成字典方便使用。
Python端处理代码:
把原来的嵌套字典转换成包含键值对的列表:
import json # 你的原始数据 diff_config = { "diff1": {"diffMultiplier": 1, "color": "green"}, "diff2": {"diffMultiplier": 2, "color": "yellow"} } # 转换为Unity可解析的数组格式 converted_data = [{"key": key, "value": value} for key, value in diff_config.items()] # 写入JSON文件 with open("diff_config.json", "w") as f: json.dump(converted_data, f, indent=2)
转换后的JSON结构:
[ { "key": "diff1", "value": { "diffMultiplier": 1, "color": "green" } }, { "key": "diff2", "value": { "diffMultiplier": 2, "color": "yellow" } } ]
Unity端C#代码:
定义对应的可序列化类,解析后转成字典:
using System.Collections.Generic; using UnityEngine; using System.IO; [System.Serializable] public class DiffData { public float diffMultiplier; public string color; } [System.Serializable] public class KeyedDiffEntry { public string key; public DiffData value; } public class DiffConfigLoader : MonoBehaviour { void LoadConfig() { string jsonPath = Path.Combine(Application.streamingAssetsPath, "diff_config.json"); string jsonText = File.ReadAllText(jsonPath); // 解析为数组 KeyedDiffEntry[] entries = JsonUtility.FromJson<KeyedDiffEntry[]>(jsonText); // 转成字典方便快速查找 Dictionary<string, DiffData> diffDict = new Dictionary<string, DiffData>(); foreach (var entry in entries) { diffDict[entry.key] = entry.value; } // 和Python一样的用法 string targetDiff = "diff1"; string color = diffDict[targetDiff].color; float multiplier = diffDict[targetDiff].diffMultiplier; } }
方案2:使用Unity官方集成的Newtonsoft.Json库
Unity包管理器里有官方维护的Newtonsoft.Json(JSON.NET),支持直接解析字典,不用修改Python的JSON结构。
安装步骤:
- 打开Unity包管理器(Window > Package Manager)
- 点击左上角的
+号,选择Add package from git URL - 输入
com.unity.nuget.newtonsoft-json,等待安装完成
Unity端C#代码:
直接解析为字典,和Python用法一致:
using System.Collections.Generic; using UnityEngine; using System.IO; using Newtonsoft.Json; public class DiffData { public float diffMultiplier { get; set; } public string color { get; set; } } public class DiffConfigLoader : MonoBehaviour { void LoadConfig() { string jsonPath = Path.Combine(Application.streamingAssetsPath, "diff_config.json"); string jsonText = File.ReadAllText(jsonPath); // 直接解析为嵌套字典对应的类型 Dictionary<string, DiffData> diffDict = JsonConvert.DeserializeObject<Dictionary<string, DiffData>>(jsonText); // 直接使用 string targetDiff = "diff1"; string color = diffDict[targetDiff].color; } }
这个方案最省心,Python端不需要任何额外处理,直接输出原本的嵌套字典JSON即可。
方案3:用ScriptableObject做游戏配置(可选)
如果不需要跨语言JSON交互,也可以用Unity的ScriptableObject来存储配置,适合游戏内静态数据。你可以写个简单的Python脚本生成.asset文件,或者手动在Unity编辑器里创建,之后直接通过代码引用,不需要解析步骤。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

