Unity嵌套JSON反序列化异常:无法读取模型位置字典数据
Unity读取嵌套JSON字典数据的解决方案
问题核心
你的代码存在两个关键问题导致无法读取数据:
- 语法错误:
textJson.遗漏了text属性,应该是textJson.text - Unity自带的
JsonUtility不支持直接序列化/反序列化Dictionary,这是无法解析动态键名模型数据的根本原因
方案一:基于Unity自带JsonUtility的自定义可序列化字典
先实现一个支持序列化的字典类,替代原生Dictionary:
[System.Serializable] public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, ISerializationCallbackReceiver { [SerializeField] private List<TKey> keys = new List<TKey>(); [SerializeField] private List<TValue> values = new List<TValue>(); // 序列化时将字典内容转存为列表 public void OnBeforeSerialize() { keys.Clear(); values.Clear(); foreach (var pair in this) { keys.Add(pair.Key); values.Add(pair.Value); } } // 反序列化时将列表内容转回字典 public void OnAfterDeserialize() { this.Clear(); if (keys.Count != values.Count) throw new System.Exception($"序列化键值数量不匹配:键{keys.Count}个,值{values.Count}个"); for (int i = 0; i < keys.Count; i++) { this[keys[i]] = values[i]; } } }
然后修改你的数据类和读取逻辑:
public class sceneCreator : MonoBehaviour{ public TextAsset textJson; public RootData A1Data = new RootData(); void Start(){ // 修复语法错误:添加text属性 A1Data = JsonUtility.FromJson<RootData>(textJson.text); } } [System.Serializable] public class PositionData { public float[] location; public float[] rotate; public float[] scale; } [System.Serializable] public class ModelData { public PositionData[] positions; } [System.Serializable] public class A1DynamicData { // 替换为自定义可序列化字典 public SerializableDictionary<string, ModelData> models; } [System.Serializable] public class RootData { public A1DynamicData A_1_Dynamic; }
方案二:使用Newtonsoft.Json(更简洁)
Unity支持通过Package Manager安装官方维护的Newtonsoft.Json包,步骤:
- 打开
Window > Package Manager - 点击左上角
+>Add package from git URL - 输入
com.unity.nuget.newtonsoft-json并安装
安装后直接用Newtonsoft的反序列化方法,无需自定义字典:
using Newtonsoft.Json; public class sceneCreator : MonoBehaviour{ public TextAsset textJson; public RootData A1Data; void Start(){ A1Data = JsonConvert.DeserializeObject<RootData>(textJson.text); } } [System.Serializable] public class PositionData { public float[] location; public float[] rotate; public float[] scale; } [System.Serializable] public class ModelData { public PositionData[] positions; } [System.Serializable] public class A1DynamicData { // 直接使用原生Dictionary即可 public Dictionary<string, ModelData> models; } [System.Serializable] public class RootData { public A1DynamicData A_1_Dynamic; }
验证步骤
- 将你的JSON文件拖到Unity项目中,设置其Inspector的
Texture Type为Text Asset - 在场景中挂载
sceneCreator脚本,将JSON文件拖到textJson字段 - 运行场景即可读取到嵌套的位置数据
内容的提问来源于stack exchange,提问作者CooperVR
相关产品推荐
相关产品推荐

