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
相关产品推荐
相关产品推荐

