如何在JSON字符串反序列化前移除外层多余的data节点元素
解决方案
方案1:定义响应包装类(最推荐,可复用性最高)
你可以提前定义通用的接口响应包装类,适配所有外层带data的接口返回:
// 定义通用响应包装类 public class ApiResponse<T> { public T data { get; set; } }
修改单元测试的反序列化逻辑即可:
using (var client = new HttpClient()) { var response = await client.GetAsync("/Balance"); var responseString = await response.Content.ReadAsStringAsync(); // 直接反序列化到带包装的结构 var apiResult = JsonConvert.DeserializeObject<ApiResponse<List<BalanceModelDto>>>(responseString); // 取data数组第一个元素做断言(可根据你的业务逻辑调整取值逻辑) var result = apiResult.data.FirstOrDefault(); Assert.IsType<BalanceModelDto>(result); Assert.Equal(1, result.Balance); }
方案2:用JObject动态解析(无需额外定义类,适合一次性使用场景)
如果你不想额外新增包装类,可以直接用Newtonsoft.Json提供的JObject解析后取data节点:
using (var client = new HttpClient()) { var response = await client.GetAsync("/Balance"); var responseString = await response.Content.ReadAsStringAsync(); // 解析为JObject后直接取data字段 var jObject = Newtonsoft.Json.Linq.JObject.Parse(responseString); var dataList = jObject["data"].ToObject<List<BalanceModelDto>>(); var result = dataList.FirstOrDefault(); Assert.IsType<BalanceModelDto>(result); Assert.Equal(1, result.Balance); }
不推荐直接裁剪字符串的方式:如果后续接口返回结构调整、字段顺序变化,字符串裁剪逻辑很容易失效,容错率远低于JSON解析方案。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

