API响应转DataTable时遇“JSON字符串含额外文本”错误
问题分析与解决方案
错误原因
你直接将API返回的JSON反序列化为DataTable,但当前API返回的是单个错误对象(结构为{"Status":"Failed","Code":"400","Message":"Request initiation failed"}),而DataTable对应的JSON结构必须是数组格式(例如[{"字段名":"值"},{"字段名":"值"}]),类型不匹配导致抛出"Additional text found in JSON string"错误。
解决步骤
定义API响应类
先创建一个对应API返回结构的类,用来统一处理成功/失败的响应:public class ApiResponse { public string Status { get; set; } public string Code { get; set; } public string Message { get; set; } // 如果API成功时会返回数据列表,可添加Data字段 // public List<object> Data { get; set; } }修改代码逻辑
先解析响应的状态,判断是失败还是成功,再做对应处理:inputJsonIPColoMaster = (new JavaScriptSerializer()).Serialize(inputIPColoMaster); WebClient client = new WebClient(); client.Headers["Content-type"] = "application/json"; client.Encoding = Encoding.UTF8; string json = client.UploadString(apiUrl, inputJsonIPColoMaster); DataTable dtRes = new DataTable(); // 先解析API响应状态 var apiResponse = JsonConvert.DeserializeObject<ApiResponse>(json); if ("Failed".Equals(apiResponse.Status, StringComparison.OrdinalIgnoreCase)) { // 处理错误场景,比如抛出异常或记录日志 throw new InvalidOperationException($"API请求失败:{apiResponse.Message}(错误码:{apiResponse.Code})"); } else { // 若API成功时返回的是数组结构,直接反序列化为DataTable dtRes = JsonConvert.DeserializeObject<DataTable>(json); // 若API成功时返回的是包含数据的对象(如{"Status":"Success","Data":[]}),则调整为: // var successResponse = JsonConvert.DeserializeObject<SuccessApiResponse>(json); // dtRes = successResponse.Data; }
补充说明
如果API成功时的响应是包裹了数据的对象(而非直接返回数组),需要额外定义对应成功响应的类,例如:
public class SuccessApiResponse { public string Status { get; set; } public DataTable Data { get; set; } }
内容的提问来源于stack exchange,提问作者Nadeem
相关产品推荐
相关产品推荐

