Xamarin Form消费JSON时调试器跳过列表赋值问题求解
问题原因
- 最核心的触发点是反序列化操作抛出了未捕获异常:你调用的
http://ip.jsontest.com返回的JSON结构是单个对象(示例返回为{"ip": "123.xx.xx.xx"}),并非数组结构,你直接将其反序列化为List<IpAddress>类型时,Newtonsoft.Json会抛出类型不匹配的JsonException。 - 异步方法的异常机制导致调试直接跳出:由于
FillList是异步Task方法,未被捕获的异常会被封装到返回的Task对象中,如果你在调用FillList时没有添加await关键字、也没有注册异常处理逻辑,调试器就会直接跳出当前方法块,表现为跳过后续的列表填充、遍历逻辑。
修复方案
1. 异常捕获定位通用方案
在Visual Studio调试菜单中打开「异常设置」面板,勾选Newtonsoft.Json.JsonException、System.NullReferenceException等公共异常类型,调试时异常抛出就会直接断在对应代码行,可直接查看错误详情。
2. 适配返回结构修改反序列化逻辑
针对当前单条返回的测试接口,修改反序列化代码即可:
private static async System.Threading.Tasks.Task FillList() { // 注意:生产环境建议HttpClient全局单例,避免频繁创建销毁导致端口占用问题 using (var httpClient = new HttpClient()) { var json = await httpClient.GetStringAsync("http://ip.jsontest.com"); // 单条返回直接反序列化为IpAddress对象,再存入列表 IpAddress singleIp = JsonConvert.DeserializeObject<IpAddress>(json); List<IpAddress> ipAddress = new List<IpAddress> { singleIp }; foreach (IpAddress address in ipAddress) { Console.WriteLine(address.IP.ToString()); } } }
如果实际业务接口同时兼容单条/多条返回,可增加结构判断逻辑:
List<IpAddress> ipAddress; if (json.TrimStart().StartsWith("[")) { ipAddress = JsonConvert.DeserializeObject<List<IpAddress>>(json); } else { var single = JsonConvert.DeserializeObject<IpAddress>(json); ipAddress = new List<IpAddress> { single }; }
3. 异步方法调用注意事项
调用FillList的位置必须添加await关键字,否则异步方法内部的异常不会主动抛出,也会导致逻辑执行异常:
// 错误调用方式,无法捕获异常 FillList(); // 正确调用方式 await FillList();
内容的提问来源于stack exchange,提问作者Buck Hicks
相关产品推荐
相关产品推荐

