使用Newtonsoft.Json反序列化地图JSON遇CS1503/CS0266错误求助
问题解决方案
错误原因分析
CS1503错误:混淆了
System.Text.Json和Newtonsoft.Json的API。若使用Newtonsoft.Json的JsonSerializer.Deserialize方法,它不支持直接传入字符串参数(需要JsonReader);而System.Text.Json的同名方法支持字符串参数,但需确保引用正确的命名空间。CS0266错误:
JsonConvert.DeserializeObject()(Newtonsoft.Json)默认返回object类型,必须显式指定泛型参数或强制转换,才能赋值给Map类型变量。
具体解决方法
方法1:使用System.Text.Json(.NET内置库)
确保代码顶部引用正确命名空间:
using System.Text.Json;
然后使用正确的反序列化语句:
string hol = File.ReadAllText(dir + @"maps\map1.json"); Map jsonMap = JsonSerializer.Deserialize<Map>(hol)!; mapCollision = jsonMap.collision; layers = jsonMap.layer;
注意:如果JSON中的键名和类属性名大小写不匹配(比如JSON用大写开头),需给类属性添加
[JsonPropertyName]特性,示例:public class Map{ [JsonPropertyName("Layer")] public string[][] layer {get; set;} [JsonPropertyName("Collision")] public int[][] collision {get; set;} }
方法2:使用Newtonsoft.Json(Json.NET)
先通过NuGet安装Newtonsoft.Json包,再引用命名空间:
using Newtonsoft.Json;
选择以下两种正确的反序列化方式之一:
方式A:泛型版本(推荐)
string hol = File.ReadAllText(dir + @"maps\map1.json"); Map jsonMap = JsonConvert.DeserializeObject<Map>(hol)!; mapCollision = jsonMap.collision; layers = jsonMap.layer;
方式B:强制转换非泛型版本
string hol = File.ReadAllText(dir + @"maps\map1.json"); Map jsonMap = (Map)JsonConvert.DeserializeObject(hol)!; mapCollision = jsonMap.collision; layers = jsonMap.layer;
额外检查项
- 确认JSON文件格式正确,锯齿数组结构需符合要求,示例:
{ "layer": [ ["grass", "dirt"], ["stone", "water"] ], "collision": [ [0, 1], [1, 0] ] } - 确保
Map类的属性为public且包含get/set访问器(你的代码已满足)。
内容的提问来源于stack exchange,提问作者Tilak Rao
相关产品推荐
相关产品推荐

