.NET MAUI中JsonSerializer.DeserializeAsync无结果无异常问题排查
解决.NET MAUI中HTTP响应反序列化无结果/起始值无效问题
问题核心原因
- 不可序列化属性阻塞反序列化:PlayerModel继承的BaseViewModel中包含
ICommand类型的ValidateCommand属性,ICommand属于.NET UI层类型,无法被System.Text.Json默认反序列化。JSON响应中返回的validateCommand:{}会触发反序列化失败,但MAUI异步上下文可能吞掉异常,表现为代码无报错直接停止。 - 控制台测试的起始值错误:大概率是响应内容编码不匹配或存在多余前缀字符(如BOM、非JSON字符),导致反序列化器读取到无效起始字符'S'。
解决方案
1. 标记不可序列化属性
在BaseViewModel中,对UI相关的非序列化属性添加[JsonIgnore]特性,排除反序列化范围:
using System.Text.Json.Serialization; public class BaseViewModel : INotifyPropertyChanged { // 其他属性和INotifyPropertyChanged实现... [JsonIgnore] public ICommand ValidateCommand { get; set; } [JsonIgnore] public bool HasErrors { get; set; } }
2. 优化反序列化逻辑,排查响应内容
改用字符串读取方式先确认响应内容完整性,同时保留完整异常信息:
private async Task<T> SerializeResponse<T>(HttpContent content) { var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, // 忽略模型中不存在的JSON属性(可选,避免未知字段报错) IgnoreNullValues = true }; // 先读取为字符串,便于排查内容问题 var jsonContent = await content.ReadAsStringAsync(); // 输出到调试窗口,确认是否为纯JSON System.Diagnostics.Debug.WriteLine(jsonContent); try { return JsonSerializer.Deserialize<T>(jsonContent, options); } catch (Exception ex) { // 输出完整异常信息,定位问题 System.Diagnostics.Debug.WriteLine($"反序列化失败:{ex}"); throw; } }
3. 修复异常处理逻辑
保留完整异常堆栈,避免丢失关键错误信息:
protected async Task<T> SendGetRequestAsync<T>(string route, object routParam) { try { var uri = BuildUri(route, routParam); var response = await httpClient.GetAsync(uri); response.EnsureSuccessStatusCode(); return await SerializeResponse<T>(response.Content); } catch (Exception ex) { // 直接抛出原始异常,保留堆栈 throw; } }
额外排查步骤
- 检查服务器响应的Content-Type是否为
application/json,若不是可手动指定编码:await content.ReadAsStringAsync(Encoding.UTF8); - 确认响应JSON中无特殊字符或BOM(可通过调试窗口输出的jsonContent查看)
内容的提问来源于stack exchange,提问作者Wasyster
相关产品推荐
相关产品推荐

