Unity中JsonConvert反序列化Vector2Int失败问题求助
解决Unity中Newtonsoft.Json反序列化Vector2Int的问题
首先,你的自定义Vec2Converter反序列化逻辑存在明显问题,这是导致Vector2Int无法正确转换的核心原因;另外Unity崩溃的情况大概率和旧序列化数据与新类型不兼容有关,我们一步步来解决:
1. 修复自定义JsonConverter的逻辑
你的ReadJson方法里调用serializer.Deserialize<Vector2Int>(reader)会陷入循环调用(因为转换器已经注册给Vector2Int了),而且此时reader读取到的是"(x,y)"格式的字符串,直接反序列化必然报错。我们需要手动解析这个字符串来生成Vector2Int:
using Newtonsoft.Json; using UnityEngine; using System; using System.Text.RegularExpressions; public class Vec2Converter : JsonConverter { // 序列化时保持原有逻辑,输出Vector2Int的ToString()格式 public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var vec = (Vector2Int)value; writer.WriteValue(vec.ToString()); } // 反序列化时手动解析"(x,y)"格式的字符串 public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.String) { var str = reader.Value.ToString().Trim(); // 用正则提取x和y的数值,兼容带空格的格式比如"(1, 2)" var match = Regex.Match(str, @"\((-?\d+),\s*(-?\d+)\)"); if (match.Success) { int x = int.Parse(match.Groups[1].Value); int y = int.Parse(match.Groups[2].Value); return new Vector2Int(x, y); } } // 解析失败时抛出明确异常,方便排查问题 throw new JsonSerializationException($"无法将值 {reader.Value} 转换为Vector2Int"); } public override bool CanConvert(Type objectType) { return objectType == typeof(Vector2Int); } }
2. 确保转换器正确生效
有两种可靠的方式让转换器生效,选择其中一种即可:
方式一:在字段上添加特性标记
直接在Lineup类的cardLocations字段上标记转换器,让Newtonsoft.Json自动识别:
public class Lineup { [JsonConverter(typeof(Vec2Converter))] // 添加这个特性 public Dictionary<Vector2Int, Collection> cardLocations; // 其他字段... }
方式二:序列化/反序列化时传入转换器实例
调用JsonConvert方法时,手动传入包含转换器的配置:
// 序列化示例 var jsonSettings = new JsonSerializerSettings(); jsonSettings.Converters.Add(new Vec2Converter()); string serializedJson = JsonConvert.SerializeObject(userInfoInstance, jsonSettings); // 反序列化示例 UserInfo deserializedUser = JsonConvert.DeserializeObject<UserInfo>(serializedJson, jsonSettings);
3. 解决Unity崩溃的问题
当你修改Vector2Int为其他数据结构时Unity崩溃,本质是旧的序列化Json数据和新的类型不匹配,反序列化时触发未捕获的致命异常导致进程崩溃。解决方法:
- 测试阶段先清理旧的Json数据(比如删除PlayerPrefs存储文件、清空测试用的Json字符串)
- 如果需要兼容旧数据,要确保新类型的反序列化逻辑能处理旧格式,或者提前做数据迁移
验证修复
完成上述修改后,重新测试序列化和反序列化流程:
- 序列化
UserInfo对象,确认cardLocations的Key是"(x,y)"格式的字符串 - 反序列化后检查
cardLocations的Key是否正确转换为Vector2Int实例,不再抛出ArgumentException
内容的提问来源于stack exchange,提问作者Seaky
相关产品推荐
相关产品推荐

