C#使用Json.NET反序列化JSON输出数据时出现CS1061报错求助
CS1061报错修复方案
报错根因
你的CObject()方法返回值类型是List<Todos>(即Todos对象的集合),但你在Main方法中直接调用todos.title,试图从列表容器本身访问只有单个Todos实例才具备的title属性,编译器因此抛出"List类型未定义title成员"的错误。
修复步骤
1. 修正集合属性的访问方式
要获取title字段,必须先拿到集合内的单个Todos实例,你可以遍历整个列表输出所有项的标题,也可以通过索引访问指定项。
将Main方法的逻辑替换为如下代码即可解决编译错误:
static void Main(string[] args) { var todos = CObject(); if (todos != null) { // 遍历输出所有待办事项的标题 foreach (var item in todos) { Console.WriteLine(item.title); } Console.ReadKey(); } }
如果仅需输出第一条待办的标题,直接使用索引访问即可:Console.WriteLine(todos[0].title);
2. 修复数据读取方法的逻辑漏洞
你当前的CObject()方法存在两个会导致运行异常的逻辑问题,即使解决编译错误也无法正常拿到数据:
- 远程接口拉取逻辑错误:
WebClient.DownloadString()会直接返回接口响应的JSON字符串,不是文件路径。你后续用File.Exists(urlfile)、File.ReadAllText(urlfile)的写法,是把整个JSON内容当作本地文件路径做判断,永远不会命中这个分支。 - 远程拉取到内容后没有做反序列化,也没有返回逻辑,本地文件不存在时方法会直接返回null。
修正后的CObject()方法代码如下:
static List<Todos> CObject() { string localfile = @"C:\g\todos.json"; // 优先读取本地缓存文件 if(File.Exists(localfile)) { return JsonConvert.DeserializeObject<List<Todos>>(File.ReadAllText(localfile)); } // 本地无缓存时拉取远程接口数据 string remoteJson = new WebClient().DownloadString("https://jsonplaceholder.typicode.com/todos"); var todos = JsonConvert.DeserializeObject<List<Todos>>(remoteJson); // 可选:将拉取到的远程数据写入本地缓存,下次启动无需重复请求接口 if (todos != null) { Directory.CreateDirectory(Path.GetDirectoryName(localfile)); File.WriteAllText(localfile, remoteJson); } return todos; }
额外优化建议
你定义的Todos类中,userId使用byte类型、id使用ushort类型,当接口返回的userId超过255、id超过65535时会触发反序列化溢出错误,测试场景下可以正常使用,生产环境建议将这两个字段改为int类型兼容性更好。
内容的提问来源于stack exchange,提问作者Kerkus
相关产品推荐
相关产品推荐

