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
相关产品推荐
相关产品推荐

