You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:02:08