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

JSON反序列化异常:ABCRequest接口请求体格式问题排查

接口反序列化异常排查与解决

问题场景

定义了如下UserRequest和ABCRequest模型类,调用POST接口时先后遇到两次异常:

模型代码

[Route("/somepath", Verbs = "POST")]
public class ABCRequest
{
    public List<UserRequest> Requests { get; set; }
}

public class UserRequest
{
    public int UserID { get; set; }
    public DateTime FromDate { get; set; }
    public DateTime ToDate { get; set; }
}

第一次请求与异常

提交数组格式的JSON请求体:

[
    {
      "UserID": 123,
      "FromDate": "2015-01-01T00:00:00",
      "ToDate": "2016-01-01T23:59:59"
    },
    {
      "UserID": 456,
      "FromDate": "2015-01-01T00:00:00",
      "ToDate": "2016-01-01T23:59:59"
    }
]

抛出反序列化异常:

Could not deserialize 'application/json'
Error: Type definitions should start with a '{', expecting serialized type 'ABCRequest', got string starting with: [, {, "UserId": 123,
"From",

第二次请求与异常

改用包裹对象的请求体:

{
  "Requests": [
    {
      "UserID": 123,
      "FromDate": "2015-01-01T00:00:00",
      "ToDate": "2016-01-01T23:59:59"
    },
    {
      "UserID": 456,
      "FromDate": "2015-01-01T00:00:00",
      "ToDate": "2016-01-01T23:59:59"
    }
  ]
}

但提示:Request Dto is not supported

接口Post方法代码

简化版:

public async Task<SomeResponse> Post(ABCRequest request) 
{ var responses = new List<someResponse>(); 
  foreach (var userRequest in request.Requests) 
  {
   // 业务代码
  }
}

完整代码:

public async Task<SomeResponse> Post(ABCRequestRequest request)
{
    var responses = new List<GetSomeResponse>();
    foreach (var userRequest in request.Requests)
    {
        var userSummaries = await someService.GetSummaryAsync(
            userRequest.UserID, userRequest.FromDate.ToString(),  userRequest.ToDate.ToString());

        var data = userSummaries
            .Where(data => data.SomeData != 0)
            .Select(data => data).ToList();

        var response = new GetSomeResponse
        {
            UserID = userRequest.UserID
        };
        responses.Add(response);
    }
    return new SomeResponse
    {
        Responses = responses
    };
}

问题原因与解决

核心错误

第二次请求的JSON格式是正确的,但Post方法的参数类型写错了:定义的请求DTO是ABCRequest,但完整方法中参数用的是ABCRequestRequest,两者不匹配,导致框架无法识别请求DTO,抛出“Request Dto is not supported”错误。

解决方案

将Post方法的参数类型修正为ABCRequest,与定义的模型类一致:

public async Task<SomeResponse> Post(ABCRequest request)
{
    var responses = new List<GetSomeResponse>();
    foreach (var userRequest in request.Requests)
    {
        var userSummaries = await someService.GetSummaryAsync(
            userRequest.UserID, userRequest.FromDate.ToString(),  userRequest.ToDate.ToString());

        var data = userSummaries
            .Where(data => data.SomeData != 0)
            .Select(data => data).ToList();

        var response = new GetSomeResponse
        {
            UserID = userRequest.UserID
        };
        responses.Add(response);
    }
    return new SomeResponse
    {
        Responses = responses
    };
}

补充说明

第一次请求的错误原因是:接口接收的是ABCRequest类型(包含Requests数组的对象),但直接提交了数组JSON,不符合目标类型的结构,因此反序列化失败。第二次的请求体格式已经匹配ABCRequest的结构,只要修正方法参数类型即可正常运行。

内容的提问来源于stack exchange,提问作者wax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:53:21