使用RestSharp反序列化Web服务返回数据遇到问题求助
解决RestSharp反序列化Web服务数据到SalesOrderModel列表的问题
我之前也踩过RestSharp反序列化的坑,给你梳理几个关键的排查点和解决步骤,应该能帮你搞定:
第一步:先明确返回数据的结构
首先你得把Web服务返回的原始JSON数据打印出来(可以用response.Content获取),确认它的结构是哪种:
- 情况1:返回的是包含数组的根对象,比如:
{
"salesOrders": [
{"orderId": "SO123", "total": 100},
{"orderId": "SO124", "total": 200}
]
}
- 情况2:返回的是直接的数组,比如:
[
{"orderId": "SO123", "total": 100},
{"orderId": "SO124", "total": 200}
]
结构不同,反序列化的方式完全不一样,这是最容易出错的地方。
第二步:调整模型类(包括包装器)
如果是情况1(根对象包含数组)
你需要一个包装器类来对应根结构,同时确保属性和JSON键正确映射:
// 包装器类,对应根JSON的结构 public class SalesOrderResponse { // 这里的属性名要和JSON里的数组键一致,或者用特性指定 // 用System.Text.Json的话用[JsonPropertyName],用Newtonsoft.Json用[JsonProperty] [JsonPropertyName("salesOrders")] public List<SalesOrderModel> SalesOrders { get; set; } } // 你的SalesOrderModel类,要和数组里的每个对象字段对应 public class SalesOrderModel { [JsonPropertyName("orderId")] public string OrderId { get; set; } [JsonPropertyName("total")] public decimal TotalAmount { get; set; } }
如果是情况2(直接返回数组)
不需要包装器,直接把泛型指定为List<SalesOrderModel>就行。
第三步:正确使用RestSharp反序列化
针对情况1的代码示例
var client = new RestClient("你的Web服务基础地址"); var request = new RestRequest("接口路径", Method.Post); // 添加请求参数(比如POST的请求体) request.AddJsonBody(你的请求实体); // 执行请求并反序列化到包装器类 var response = await client.ExecuteAsync<SalesOrderResponse>(request); if (response.IsSuccessful) { // 从包装器里取出列表 List<SalesOrderModel> orderList = response.Data.SalesOrders; // 这里就可以正常使用列表了 } else { // 先排查请求失败的原因,比如HTTP状态码、错误信息 Console.WriteLine($"请求失败:{response.ErrorMessage}"); }
针对情况2的代码示例
只需要把泛型改成List<SalesOrderModel>:
var response = await client.ExecuteAsync<List<SalesOrderModel>>(request); if (response.IsSuccessful) { List<SalesOrderModel> orderList = response.Data; }
几个容易踩的坑
- 大小写不匹配:RestSharp默认的序列化器(不管是System.Text.Json还是Newtonsoft)可能区分大小写,要么让模型属性名和JSON键完全一致,要么开启大小写不敏感配置:
// 用System.Text.Json的话,配置大小写不敏感 var jsonOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; client.UseSystemTextJson(jsonOptions); - 忽略了请求失败:如果
response.IsSuccessful是false,response.Data肯定是null,先检查HTTP状态码和错误信息,排除接口本身的问题。 - 特性用错了:如果你用的是RestSharp默认的System.Text.Json,要用
[JsonPropertyName];如果是手动配置了Newtonsoft.Json,才用[JsonProperty],别搞混了。
先按照这个步骤排查一遍,应该就能解决你的问题了。
内容的提问来源于stack exchange,提问作者jon.r
相关产品推荐
相关产品推荐

