C#中JSON反序列化时Address字段子属性无法获取的求助
解决C# JSON反序列化无法获取Address子属性的问题
问题根源
- 属性名不匹配:JSON中地址字段名为
Address,但实体类Event中对应的属性是address1,序列化器无法识别映射关系,导致Address1的子属性始终为null。 - 反序列化类型错误:提供的JSON是单个
Event对象,你却尝试反序列化为IEnumerable<Event>集合,这会直接返回null或引发序列化异常。
修正步骤
1. 对齐实体类与JSON字段名
方案一:直接修改属性名(推荐)
将Event类中的地址属性名改为和JSON一致的Address:
public class Event { public string Name { get; set; } public DateTime Start { get; set; } public DateTime End { get; set; } public string AdditionalInformation { get; set; } // 修改属性名匹配JSON的"Address"字段 public Address1 Address { get; set; } } public class Address1 { public string Information { get; set; } public string City { get; set; } public string CountryIso2 { get; set; } }
方案二:使用特性指定映射(适合无法修改属性名的场景)
通过JsonPropertyName特性强制指定JSON字段名:
using System.Text.Json.Serialization; public class Event { public string Name { get; set; } public DateTime Start { get; set; } public DateTime End { get; set; } public string AdditionalInformation { get; set; } // 绑定JSON中的"Address"字段到当前属性 [JsonPropertyName("Address")] public Address1 address1 { get; set; } } public class Address1 { public string Information { get; set; } public string City { get; set; } public string CountryIso2 { get; set; } }
2. 修正反序列化目标类型
由于JSON是单个对象,将反序列化的目标类型改为Event而非集合:
public class DataService { public async Task<Event?> GetEventsAsync() { return JsonSerializer.Deserialize<Event>(await File.ReadAllTextAsync("Data/Events.json")); } }
如果你的JSON文件实际是多个Event组成的数组(格式为[{"Name":"..."}, {...}]),可以保留IEnumerable<Event>类型。
可选:处理大小写敏感性
如果后续遇到仅大小写差异的字段映射问题,可以开启忽略大小写配置:
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; return JsonSerializer.Deserialize<Event>(await File.ReadAllTextAsync("Data/Events.json"), options);
内容的提问来源于stack exchange,提问作者Gamer X.
相关产品推荐
相关产品推荐

