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

使用Newtonsoft.Json反序列化地图JSON遇CS1503/CS0266错误求助

问题解决方案

错误原因分析

  1. CS1503错误:混淆了System.Text.Json和Newtonsoft.Json的API。若使用Newtonsoft.Json的JsonSerializer.Deserialize方法,它不支持直接传入字符串参数(需要JsonReader);而System.Text.Json的同名方法支持字符串参数,但需确保引用正确的命名空间。

  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 05:49:56