You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将JSON反序列化为AdvanceEventsDto模型?遇类型错误求助

解决方案

问题分析

  1. 原dynamic代码报错原因:你的JSON根节点是对象(包含Events数组和Winner属性),并非数组,所以使用AdvanceEvent[0]按数组索引访问对象会触发类型不匹配错误。
  2. 模型与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:50:33