REST API返回JSON转DataTable报错:预期StartArray却得到StartObject
问题:将REST API返回的JSON转换为DataTable时出错
我正尝试将REST API返回的JSON响应转换为DataTable,执行转换代码时出现错误。
我的代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using RestSharp; using Newtonsoft.Json; using System.Data; namespace RestDemo1 { class Program { static void Main(string[] args) { getEmployeeData(); } public static void getEmployeeData() { var client = new RestClient("https://crmscf.vidyasystems.com/api/gen/items.php"); var request = new RestRequest("items"); var response = client.Execute(request); string vJ = ""; if (response.StatusCode == System.Net.HttpStatusCode.OK) { string rawResponse = response.Content; DataTable tester = (DataTable)JsonConvert.DeserializeObject(rawResponse, (typeof(DataTable))); } } public class Rootobject { public int success { get; set; } public Item[] items { get; set; } public class Item { public string ItemID { get; set; } public string ItemName { get; set; } public string ItemDesc { get; set; } public string MRP { get; set; } public string Rate { get; set; } public string Unit { get; set; } public string Weight { get; set; } public string ItemGroup { get; set; } } } } }
错误代码行
DataTable tester = (DataTable)JsonConvert.DeserializeObject(rawResponse, (typeof(DataTable)));
错误信息
Newtonsoft.Json.JsonSerializationException: '读取DataTable时遇到意外的JSON令牌。预期为数组起始标记(StartArray),但得到对象起始标记(StartObject)。路径 '',第1行,位置1。'
解决方案
错误原因很明确:API返回的JSON是一个外层对象(以{}开头),而Newtonsoft.Json直接反序列化为DataTable时,期望的是一个数组(以[]开头)。你的JSON结构包含success字段和items数组,所以需要先解析外层对象,再提取内部的数组来转换为DataTable。
修改后的代码如下:
public static void getEmployeeData() { var client = new RestClient("https://crmscf.vidyasystems.com/api/gen/items.php"); var request = new RestRequest("items"); var response = client.Execute(request); if (response.StatusCode == System.Net.HttpStatusCode.OK) { string rawResponse = response.Content; // 1. 先反序列化为你定义的Rootobject类型 var rootData = JsonConvert.DeserializeObject<Rootobject>(rawResponse); // 2. 将items数组转换为DataTable DataTable tester = JsonConvert.DeserializeObject<DataTable>(JsonConvert.SerializeObject(rootData.items)); } }
核心逻辑就是:先获取到包含业务数据的items数组部分,再将数组转换为DataTable,而不是直接处理整个外层对象。
内容的提问来源于stack exchange,提问作者SDS
相关产品推荐
相关产品推荐

