如何将JSON反序列化为AdvanceEventsDto模型?遇类型错误求助
解决方案
问题分析
- 原dynamic代码报错原因:你的JSON根节点是对象(包含
Events数组和Winner属性),并非数组,所以使用AdvanceEvent[0]按数组索引访问对象会触发类型不匹配错误。 - 模型与JSON结构不匹配:JSON中的
Events是string[]类型,但你的AdvanceEventsDto将Events定义为EventsDto[],而EventsDto内部又包含一个Events字符串属性,这种结构无法直接映射,会导致反序列化失败。
方案一:调整模型匹配JSON结构(推荐)
直接修改AdvanceEventsDto,让其属性类型与JSON结构完全对应,无需额外转换器:
public class AdvanceEventsDto { /// <summary> /// The Event List /// </summary> public string[] Events { get; set; } /// <summary> /// The Winner /// </summary> public string Winner { get; set; } }
反序列化代码
string filePath = System.IO.Path.GetFullPath(@"..\..\Data\AdvanceEvents.json"); string jsonContent = System.IO.File.ReadAllText(filePath); // 反序列化为自定义模型 AdvanceEventsDto advanceEvent = JsonSerializer.Deserialize<AdvanceEventsDto>(jsonContent); // 正确访问属性 string[] events = advanceEvent.Events; string winner = advanceEvent.Winner;
方案二:保留原模型,使用自定义JSON转换器
如果业务需求必须保留EventsDto类,可通过自定义转换器实现字符串到EventsDto的映射:
1. 定义自定义转换器
public class EventsDtoConverter : JsonConverter<EventsDto> { public override EventsDto Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 将JSON中的字符串直接映射到EventsDto的Events属性 string eventValue = reader.GetString(); return new EventsDto { Events = eventValue }; } public override void Write(Utf8JsonWriter writer, EventsDto value, JsonSerializerOptions options) { // 序列化时将EventsDto转为字符串 writer.WriteStringValue(value.Events); } }
2. 带转换器的反序列化代码
string filePath = System.IO.Path.GetFullPath(@"..\..\Data\AdvanceEvents.json"); string jsonContent = System.IO.File.ReadAllText(filePath); var serializerOptions = new JsonSerializerOptions(); serializerOptions.Converters.Add(new EventsDtoConverter()); AdvanceEventsDto advanceEvent = JsonSerializer.Deserialize<AdvanceEventsDto>(jsonContent, serializerOptions); // 访问转换后的属性 EventsDto[] events = advanceEvent.Events; string firstEventName = events[0].Events; // 取值为"France" string winner = advanceEvent.Winner;
原dynamic代码的修正
如果只是想临时修正原dynamic代码的报错,无需切换到自定义模型,可改为正确的对象属性访问方式:
string filePath = System.IO.Path.GetFullPath(@"..\..\Data\AdvanceEvents.json"); string jsonContent = System.IO.File.ReadAllText(filePath); dynamic advanceEvent = JsonSerializer.Deserialize<dynamic>(jsonContent); var events = advanceEvent.Events; // 直接访问对象的Events属性(数组类型) string winner = advanceEvent.Winner;
内容的提问来源于stack exchange,提问作者Nuwan Indika
相关产品推荐
相关产品推荐

