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

C#从JSON填充字段并显示事件时遇反序列化报错求解决

解决JSON反序列化错误并展示事件信息

一、错误原因分析

Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'Program+Root' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.

你的JSON根结构是数组([]包裹),但代码里尝试反序列化成单个Root对象,这是核心错误。另外类定义还有几处不匹配问题:

  • 重复定义Test类,导致编译错误
  • Root类中属性名tests和JSON里的test不匹配
  • 缺少Event类的定义
  • Test1/Test2/Test3结构完全一致,没必要单独定义多个类

二、修正后的类定义

// 单个测试数据的类(test1/test2/test3结构一致,复用这个类)
public class TestData
{
    public double avg { get; set; }
    public double max { get; set; }
}

// 包含三个测试数据的类
public class TestGroup
{
    public TestData test1 { get; set; }
    public TestData test2 { get; set; }
    public TestData test3 { get; set; }
}

// 事件信息类
public class EventInfo
{
    public string date { get; set; }
    public string id { get; set; }
    public string day { get; set; }
    public string hour { get; set; }
    public string year { get; set; }
    public string @event { get; set; } // 用@转义关键字event
}

// 根对象类(对应JSON数组里的单个元素)
public class RootItem
{
    public EventInfo @event { get; set; }
    public List<TestGroup> test { get; set; } // 匹配JSON里的"test"字段
}

三、修正后的反序列化与控制台输出代码

private static void Main(string[] args)
{
    Console.WriteLine("Hello, World!");

    string link = "myurl";
    WebRequest request = WebRequest.Create(link);
    request.ContentType = "application/json";
    var Token = "mytoken";
    request.Headers.Add("Authorization", "Bearer " + Token);
    
    using (WebResponse response = request.GetResponse())
    using (Stream datastream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(datastream))
    {
        string responsefromserver = reader.ReadToEnd();
        // 反序列化成RootItem的列表,匹配JSON数组结构
        List<RootItem> eventList = JsonConvert.DeserializeObject<List<RootItem>>(responsefromserver);

        // 遍历每个事件并输出信息
        foreach (var item in eventList)
        {
            Console.WriteLine("=====================");
            Console.WriteLine($"事件ID: {item.@event.id}");
            Console.WriteLine($"事件类型: {item.@event.@event}");
            Console.WriteLine($"日期: {item.@event.date}");
            Console.WriteLine("测试数据:");
            
            // 遍历每个测试组(JSON里test是数组,这里取第一个元素即可)
            foreach (var testGroup in item.test)
            {
                Console.WriteLine($"test1 - 平均值: {testGroup.test1.avg}, 最大值: {testGroup.test1.max}");
                Console.WriteLine($"test2 - 平均值: {testGroup.test2.avg}, 最大值: {testGroup.test2.max}");
                Console.WriteLine($"test3 - 平均值: {testGroup.test3.avg}, 最大值: {testGroup.test3.max}");
            }
        }
    }

    Console.ReadKey();
}

四、关键修正点说明

  • 反序列化目标改为List<RootItem>,对应JSON的数组结构
  • 统一TestData类复用,避免重复定义
  • 修正RootItem中的属性名test,与JSON字段完全匹配
  • 补充EventInfo类,映射JSON中的event对象
  • 使用using语句自动释放资源,避免内存泄漏

内容的提问来源于stack exchange,提问作者Ivana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:00:30