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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:17:51