You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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结构。

安装步骤:

  1. 打开Unity包管理器(Window > Package Manager)
  2. 点击左上角的+号,选择Add package from git URL
  3. 输入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:06:15