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

Unity WebGL中JS向C#传递对象数组时JSON序列化异常问题

问题:Unity WebGL中JS传递JSON到C#无法正确解析

问题场景

在Unity WebGL项目中,通过JS向C#传递数据,JS端使用JSON.stringify序列化对象数组后以字符串形式传入Unity,收到的JSON内容如下:

[
    [],[],[],[],
    [
        {
            "damage": 0,
            "opaque": false,
            "safe": false

        }
    ],

    [
        {
            "damage": 0,
            "opaque": false,
            "safe": false
        }
    ]
]

不确定JSON中空数组的来源,怀疑是序列化失败的原因。

现有C#代码

序列化类定义

[System.Serializable]
public class minimap
{
    public int damage;
    public bool opaque;
    public bool safe;
}

[System.Serializable]
public class minimaps
{
    public minimap[] minimapArray;
}

接收JSON的脚本

public class GameController : MonoBehaviour
{
    public void JsonDeserialize(string minimap)
    {
        minimaps minimaps = JsonUtility.FromJson<minimaps>(minimap);

        if(minimaps != null) _debugText.text += "JSON convert completed";

        foreach (minimap mm in minimaps.minimapArray)
        {
            _debugText.text += "Damage: " + mm.damage + "opaque: " + mm.opaque;
        }
    }
}

调试显示JSON convert completed,但遍历minimapArray的循环未执行,数组看似有内容却无法访问。


解决方法

1. 核心问题:JSON结构与C#类不匹配

收到的JSON是数组的数组(外层为数组,每个元素是子数组,可能为空或包含单个minimap对象),但你定义的minimaps类期望的是一个包含minimapArray字段的对象,结构完全不匹配,导致无法正确解析。

2. 修正序列化逻辑

Unity的JsonUtility不支持直接反序列化顶级数组(JSON以[开头),需要先将JSON包装为带字段的对象,再匹配数组结构:

public class GameController : MonoBehaviour
{
    public void JsonDeserialize(string minimapJson)
    {
        // 把顶级数组包装成带字段的JSON对象
        string wrappedJson = "{\"subArrays\":" + minimapJson + "}";
        MinimapWrapper wrapper = JsonUtility.FromJson<MinimapWrapper>(wrappedJson);

        if(wrapper != null) _debugText.text += "\nJSON convert completed";

        // 遍历外层数组
        foreach (var subArray in wrapper.subArrays)
        {
            // 遍历子数组中的有效对象
            foreach (minimap mm in subArray)
            {
                if(mm != null)
                {
                    _debugText.text += "\nDamage: " + mm.damage + " opaque: " + mm.opaque;
                }
            }
        }
    }

    // 用于包装顶级数组的辅助类
    [System.Serializable]
    private class MinimapWrapper
    {
        public List<List<minimap>> subArrays;
    }

    [System.Serializable]
    public class minimap
    {
        public int damage;
        public bool opaque;
        public bool safe;
    }
}

3. 空数组的处理

原JSON中的空数组会被反序列化为空的List,遍历过程中会自动跳过,不会影响有效数据的读取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:50:24