如何用C#遍历JSON字典并对比响应与预期响应?
解决C#遍历JSON并对比response与expected_response的问题
问题核心原因
你遇到的错误有三个关键问题:
- JSON格式不合法:多个独立JSON对象直接拼接,不是标准的JSON数组,无法正常反序列化为集合。
- 属性名映射不匹配:JSON中的
expected_response字段和类里的expectedResponse属性未关联,反序列化时会无法正确赋值。 - 反序列化类型错误:你把JSON反序列化为单个
Letters对象,而foreach只能遍历可枚举集合(如List<T>),单个对象不支持枚举,因此报错。
修正步骤
1. 修复JSON文件格式
将原始JSON改为标准数组格式,用[]包裹所有对象,对象间用逗号分隔:
[ { "request": "AAA", "response": "BBB", "expected_response": "BBB" }, { "request": "CCC", "response": "DDD", "expected_response": "DDD" }, { "request": "EEE", "response": "FFF", "expected_response": "GGG" }, { "request": "HHH", "response": "III", "expected_response": "III" }, { "request": "LLL", "response": "YYY", "expected_response": "UUU" } ]
2. 修正实体类的属性映射
给expectedResponse属性添加JsonProperty特性,匹配JSON中的expected_response字段:
using Newtonsoft.Json; // 需确保项目引用Newtonsoft.Json NuGet包 public class Letters { public string request { get; set; } public string response { get; set; } [JsonProperty("expected_response")] public string expectedResponse { get; set; } }
3. 修改反序列化与遍历代码
将反序列化目标类型改为List<Letters>,这样就能用foreach遍历每个对象:
// 读取JSON文件内容 var json = System.IO.File.ReadAllText("path/to/json/file.json"); // 反序列化为Letters对象的集合 var lettersRequests = JsonConvert.DeserializeObject<List<Letters>>(json); // 遍历对比响应与预期值 foreach (var letter in lettersRequests) { if (letter.response == letter.expectedResponse) { Console.WriteLine($"请求{letter.request}的响应与预期一致"); // 写入你的业务逻辑 } else { Console.WriteLine($"请求{letter.request}响应不符:实际{letter.response},预期{letter.expectedResponse}"); // 处理不一致的情况 } }
特殊情况处理(无法修改原始JSON时)
如果不能修改原始JSON文件的格式,可以先读取文本手动修正格式,再反序列化:
var rawJson = System.IO.File.ReadAllText("path/to/json/file.json"); // 将非标准JSON转为合法数组格式 var fixedJson = $"[{rawJson.Replace("}{", "},{")}]"; var lettersRequests = JsonConvert.DeserializeObject<List<Letters>>(fixedJson);
内容的提问来源于stack exchange,提问作者pgre pgre
相关产品推荐
相关产品推荐

