C#中JSON反序列化报错:无法将JSON对象转为List<Track>求助
解决方案
1. 错误核心原因
报错明确指出:JSON返回的是单个对象({...}),但你试图反序列化成数组类型List<Track>,这是顶层类型不匹配导致的,和Track类内部的events列表无关。
2. 步骤1:修正顶层模型类
创建根模型类匹配返回的JSON对象结构(需根据实际JSON的顶层字段调整,示例假设JSON根对象包含Tracks数组字段):
public class TrackRootResponse { // 字段名需和JSON顶层数组字段完全对应,比如JSON是{"data": [...]}就改成Data public List<Track> Tracks { get; set; } }
3. 步骤2:修正模型类名称不匹配问题
你的模型类存在名称与JSON字段不对应的问题,需调整:
- 将
DocumentReferencesMearsk改名为DocumentReferences(对应JSON里的documentReferences字段) - 将
TransportCallMaersk改名为TransportCall(对应JSON里的transportCall字段) - 若不想修改类名,可通过
JsonProperty特性指定映射:public class DocumentReferencesMearsk { [JsonProperty("documentReferenceType")] public string DocumentReferenceType { get; set; } [JsonProperty("documentReferenceValue")] public string DocumentReferenceValue { get; set; } }
4. 步骤3:修改反序列化代码
将反序列化目标改为根模型类,同时修复异步代码的不当用法:
public async Task<List<Track>> GetTracking() { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; using (var httpClient = new HttpClient()) { using (var request = new HttpRequestMessage(HttpMethod.Get, "urlxxxxxxxx...")) { request.Headers.TryAddWithoutValidation("accept", "application/json"); var response = await httpClient.SendAsync(request); response.EnsureSuccessStatusCode(); // 建议添加,确保请求成功 var jsonStr = await response.Content.ReadAsStringAsync(); // 用await替代GetResult()避免死锁 var rootResponse = JsonConvert.DeserializeObject<TrackRootResponse>(jsonStr); Tracks = rootResponse.Tracks; } } return Tracks; }
5. 额外验证建议
- 先打印
jsonStr确认顶层结构:如果JSON顶层是单个Track对象(非数组),则反序列化目标需改为Track而非List<Track>; - 可使用本地JSON转C#模型工具(如VS的“粘贴JSON为类”功能),直接生成与JSON完全匹配的模型类,避免手动编写的错误。
内容的提问来源于stack exchange,提问作者Chim Di Tru
相关产品推荐
相关产品推荐

