如何用Unity JsonUtility反序列化嵌套列表结构的JSON数据?
在Unity/C#中读取Python生成的多层嵌套JSON棋盘移动数据
先修正JSON格式
你提供的内容不是标准JSON,Python生成时可能写错了格式,posibleMovementsByDistance : 这种写法不符合JSON规范,必须改成键值对包裹在大括号里,修正后的标准JSON如下:
{ "posibleMovementsByDistance": [ [ [ {"x": 1, "y": 0, "z": 0}, {"x": 0, "y": 0, "z": 0} ], [ {"x": 0, "y": 0, "z": 1}, {"x": 1, "y": 0, "z": 1}, {"x": 2, "y": 0, "z": 0} ], [ {"x": 2, "y": 0, "z": 1} ] ], [ [ {"x": 2, "y": 0, "z": 0}, {"x": 2, "y": 0, "z": 0} ], [ {"x": 3, "y": 0, "z": 1}, {"x": 4, "y": 0, "z": 1}, {"x": 4, "y": 0, "z": 0} ], [ {"x": 4, "y": 0, "z": 1} ] ] ] }
定义对应C#序列化类
Unity自带的JsonUtility要求类必须标记[Serializable],且字段需为可序列化类型。针对你的三层嵌套结构,定义以下类:
using UnityEngine; using System.Collections.Generic; using System; // 自定义坐标类,替代Unity原生Vector3(避免序列化兼容问题) [Serializable] public class BoardCoordinate { public int x; public int y; public int z; } // 最外层包装类,对应JSON的根节点 [Serializable] public class MovementDataWrapper { // 字段名必须和JSON中的键完全一致(大小写敏感) public List<List<List<BoardCoordinate>>> posibleMovementsByDistance; }
读取和解析JSON的代码示例
在Unity中可以通过以下方式读取本地JSON文件并解析:
using UnityEngine; public class MovementDataLoader : MonoBehaviour { public TextAsset jsonFile; // 在Inspector中拖拽你的JSON文件 void Start() { if (jsonFile == null) { Debug.LogError("未指定JSON文件"); return; } // 解析JSON到包装类实例 MovementDataWrapper data = JsonUtility.FromJson<MovementDataWrapper>(jsonFile.text); // 测试输出第一个节点的第一个距离组的第一个坐标 if (data.posibleMovementsByDistance.Count > 0 && data.posibleMovementsByDistance[0].Count > 0 && data.posibleMovementsByDistance[0][0].Count > 0) { BoardCoordinate coord = data.posibleMovementsByDistance[0][0][0]; Debug.Log($"第一个坐标:x={coord.x}, y={coord.y}, z={coord.z}"); } } }
常见问题排查
- JSON格式错误:必须严格遵循标准JSON语法,比如键名用双引号,逗号分隔正确,没有多余的冒号或括号。
- 字段名不匹配:C#类的字段名必须和JSON中的键完全一致(包括大小写),
JsonUtility是大小写敏感的。 - 未加[Serializable]标记:所有需要序列化的类都必须添加
[Serializable]属性,否则JsonUtility无法识别。 - 嵌套层级错误:确保List的嵌套层级和JSON完全对应(你的结构是
List<List<List<BoardCoordinate>>>,三层嵌套)。
如果使用Newtonsoft.Json(需导入Unity包),代码逻辑类似,但无需标记[Serializable],不过Unity自带的JsonUtility在性能上更适合游戏场景。
内容的提问来源于stack exchange,提问作者karatefuki
相关产品推荐
相关产品推荐

