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; }
问题原因
- JsonUtility不支持接口类型序列化:
IEnumerable<T>是接口,Unity的JsonUtility无法将JSON数组反序列化为接口类型,必须使用具体的数组类型(如double[][][])。 - 字段名不匹配:JSON中的字段是
scales,但ModelInfo类中对应的字段是sizes,导致该字段无法被正确解析。 - 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
相关产品推荐
相关产品推荐

