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

Unity嵌套JSON反序列化异常:无法读取模型位置字典数据

Unity读取嵌套JSON字典数据的解决方案

问题核心

你的代码存在两个关键问题导致无法读取数据:

  1. 语法错误:textJson.遗漏了text属性,应该是textJson.text
  2. 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包,步骤:

  1. 打开Window > Package Manager
  2. 点击左上角+ > Add package from git URL
  3. 输入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;
}

验证步骤

  1. 将你的JSON文件拖到Unity项目中,设置其Inspector的Texture Type为Text Asset
  2. 在场景中挂载sceneCreator脚本,将JSON文件拖到textJson字段
  3. 运行场景即可读取到嵌套的位置数据

内容的提问来源于stack exchange,提问作者CooperVR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:11:20