C#中如何反序列化JSON响应,仅提取errorID与errorText字段?
问题:C#中反序列化JSON响应并仅提取errorID和errorText字段
发送POST请求后得到如下JSON响应:
{ "correlationID": "00000000-0000-0000-0000-000000000000", "scenarioID": 2, "scenarioIsAcceptedInPrinciple": false, "valid": false, "errors": [ { "errorID": 90, "errorText": "For the 1st Employment of the 1st Applicant Please provide a valid Landline" }, { "errorID": 22, "errorText": "The provided value 'string' is not a valid value for the property 'applicants[0][email]'" } ] }我希望在C#中反序列化该响应,提取其中的
errorID和errorText字段用于测试断言验证。目前我定义了如下C#类实现反序列化,能获取全部错误数据:public partial class postRequest { public bool Valid { get; set; } public object Errors { get; set; } }但我想知道如何仅提取并返回errorID和errorText字段的内容?
方法一:定义强类型类(推荐)
通过强类型实体类匹配JSON结构,既能保证类型安全,也便于后续直接访问目标字段,适合长期维护的测试代码:
- 定义对应实体类
// 错误项实体类,匹配JSON中的error结构 public class ErrorItem { // 若使用System.Text.Json,用JsonPropertyName映射字段名 [JsonPropertyName("errorID")] public int ErrorID { get; set; } [JsonPropertyName("errorText")] public string ErrorText { get; set; } } // 主响应实体类,匹配完整JSON结构 public partial class PostRequestResponse { [JsonPropertyName("valid")] public bool Valid { get; set; } [JsonPropertyName("errors")] public List<ErrorItem> Errors { get; set; } }
- 反序列化并提取目标字段
// 假设responseString是POST请求返回的JSON字符串 var response = JsonSerializer.Deserialize<PostRequestResponse>(responseString); // 提取仅包含errorID和errorText的集合 var errorDetails = response.Errors.Select(e => new { e.ErrorID, e.ErrorText }).ToList(); // 直接用于测试断言(以xUnit为例) Assert.Equal(90, errorDetails[0].ErrorID); Assert.Equal("For the 1st Employment of the 1st Applicant Please provide a valid Landline", errorDetails[0].ErrorText);
方法二:动态解析(无需定义实体类)
如果只是临时需求,不想额外定义实体类,可以直接用JSON解析库动态提取字段:
方案A:Newtonsoft.Json(JObject)
var jObject = JObject.Parse(responseString); var errors = jObject["errors"].Children<JObject>(); var errorDetails = errors.Select(j => new { ErrorID = (int)j["errorID"], ErrorText = (string)j["errorText"] }).ToList();
方案B:System.Text.Json(JsonDocument)
using var doc = JsonDocument.Parse(responseString); var errors = doc.RootElement.GetProperty("errors").EnumerateArray(); var errorDetails = new List<(int ErrorID, string ErrorText)>(); foreach (var error in errors) { errorDetails.Add( (error.GetProperty("errorID").GetInt32(), error.GetProperty("errorText").GetString()) ); }
内容的提问来源于stack exchange,提问作者kieranm007
相关产品推荐
相关产品推荐

