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
相关产品推荐
相关产品推荐

