反序列化复杂JSON对象失败:Result.Data始终为null的问题排查
问题:Result.Data属性反序列化后始终为null
我已经简化了代码,但始终找不到Result.Data属性无法赋值、一直为null的原因。JSON内容(包括这个小示例和完整内容)已经验证过是有效的,而且参考相关教程搭建的独立项目能成功序列化其中的复杂对象,但当前场景就是无法正常运行。
代码示例
using System.Text.Json; namespace JsonTest2; public class Result { public string? Total { get; set; } public string? Limit { get; set; } public string? Start { get; set; } protected List<Park>? Data { get; set; } } public class Park { public string? Id { get; set; } } internal class Program { var basepath = AppDomain.CurrentDomain.BaseDirectory; var filepath = basepath.Split("\\bin")[0]; var filename = @$"{filepath}\\NPS_response_small.json"; var jsonstr = File.ReadAllText(filename); var response = JsonSerializer.Deserialize<Result>(jsonstr, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true }); }
JSON内容
{ "total": "468", "limit": "50", "start": "0", "data": [ { "id": "77E0D7F0-1942-494A-ACE2-9004D2BDC59E" }, { "id": "6DA17C86-088E-4B4D-B862-7C1BD5CF236B" }, { "id": "E4C7784E-66A0-4D44-87D0-3E072F5FEF43" } ] }
解决方案
问题的核心在于System.Text.Json默认只处理公共(public)成员,而你的Result类中Data属性使用了protected修饰符,反序列化器无法访问并赋值这个属性。
修复方式1:修改属性为public
直接把Data的修饰符改成public,这是最直接的解决方案:
public class Result { public string? Total { get; set; } public string? Limit { get; set; } public string? Start { get; set; } public List<Park>? Data { get; set; } }
修复方式2:保留protected并添加特性
如果确实需要保持protected访问级别,可以给Data属性添加[JsonInclude]特性,让序列化器识别这个成员:
using System.Text.Json.Serialization; // 需要引入这个命名空间 public class Result { public string? Total { get; set; } public string? Limit { get; set; } public string? Start { get; set; } [JsonInclude] protected List<Park>? Data { get; set; } }
内容的提问来源于stack exchange,提问作者AdvApp
相关产品推荐
相关产品推荐

