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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:55:28