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

Unity/C#解析Python生成的嵌套JSON数组返回null问题排查

Unity JsonUtility解析嵌套JSON数组问题解决

问题背景

你有一段Python生成的嵌套结构JSON,尝试用Unity的JsonUtility解析时,要么输出0要么返回null,无法正确访问数组元素。

原始JSON数据

{
  "class_labels":[
    [
      [
        0.0,
        0.0,
        1.0
      ]
    ]
  ],
  "translations":[
    [
      [
        1.0,
        2.0,
        3.0
      ],
      [
        3.0,
        2.0,
        1.0
      ],
      [
        0.0,
        0.0,
        0.0
      ]
    ]
  ],
  "scales":[
    [
      [
        1.0,
        2.0,
        3.0
      ],
      [
        3.0,
        2.0,
        1.0
      ],
      [
        0.0,
        0.0,
        0.0
      ]
    ]
  ],
  "angles":[
    [
      [
        0.0
      ],
      [
        0.0
      ],
      [
        5.0
      ]
    ]
  ]
}

注:已移除数组元素末尾多余的逗号,避免JsonUtility解析报错

原始C#代码

public TextAsset pyOutput;
public static class JSONReader
{
    public static ModelInfo GetJSON(TextAsset pyOutput)
    {
        ModelInfo aModelInfo = JsonUtility.FromJson<ModelInfo>(pyOutput.text);
        return aModelInfo;
    }
}

private void Start()
{
    Debug.Log(JSONReader.GetJSON(pyOutput));
}

[System.Serializable]
public class ModelInfo
{
    public IEnumerable<IEnumerable<IEnumerable<double>>> class_labels;
    public IEnumerable<IEnumerable<IEnumerable<double>>> translations;
    public IEnumerable<IEnumerable<IEnumerable<double>>> sizes;
    public IEnumerable<IEnumerable<IEnumerable<double>>> angles;
}

问题原因

  1. JsonUtility不支持接口类型序列化:IEnumerable<T>是接口,Unity的JsonUtility无法将JSON数组反序列化为接口类型,必须使用具体的数组类型(如double[][][])。
  2. 字段名不匹配:JSON中的字段是scales,但ModelInfo类中对应的字段是sizes,导致该字段无法被正确解析。
  3. JSON格式小问题:原始JSON中数组元素末尾有多余逗号,虽然部分解析器兼容,但JsonUtility对格式要求更严格,可能导致解析失败。

修复后的代码

修正ModelInfo类

[System.Serializable]
public class ModelInfo
{
    // 使用具体的三维数组类型,替代IEnumerable接口
    public double[][][] class_labels;
    public double[][][] translations;
    // 修正字段名,与JSON中的scales对应
    public double[][][] scales;
    public double[][][] angles;
}

正确的访问与打印方式

修改Start方法,遍历数组元素打印,而不是直接打印对象:

private void Start()
{
    ModelInfo modelInfo = JSONReader.GetJSON(pyOutput);
    
    // 示例:打印class_labels的第一个元素
    if (modelInfo.class_labels != null && modelInfo.class_labels.Length > 0 
        && modelInfo.class_labels[0].Length > 0 && modelInfo.class_labels[0][0].Length > 0)
    {
        Debug.Log($"class_labels第一个元素:{modelInfo.class_labels[0][0][0]}, {modelInfo.class_labels[0][0][1]}, {modelInfo.class_labels[0][0][2]}");
    }
    
    // 示例:遍历translations的所有元素
    Debug.Log("translations所有元素:");
    foreach (var level1 in modelInfo.translations)
    {
        foreach (var level2 in level1)
        {
            string line = string.Join(", ", level2);
            Debug.Log(line);
        }
    }
}

验证结果

修复后,JsonUtility可以正确解析嵌套数组,通过遍历数组层级就能访问到具体的数值,控制台也能正常打印出JSON中的原始数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:07:49