JSON 数据表在 c# 中导致此错误 "Unexpected JSON token > when reading DataTable. Expected StartArray, got String. Path"

JSON to datatable causing this error in c# "Unexpected JSON token > when reading DataTable. Expected StartArray, got String. Path"

我从 API

中提取 JSON 代码

没问题

JSON输出就是这个字符串

\"[\r\n  {\r\n    \\"PtsID\\": 14061\r\n  }\r\n]\"

但是当我尝试将其转换为数据表时

使用这行代码

这是我的代码

    DataTable dt1 = (DataTable)JsonConvert.DeserializeObject(json, (typeof(DataTable)));

我收到这个错误

Newtonsoft.Json.JsonSerializationException: 'Unexpected JSON token when reading DataTable. Expected StartArray, got String. Path '', line 1, position 46.'

我尝试分析 json 字符串,但没有找到导致此错误的原因!!!

这是我的代码

      HttpClient client = new HttpClient();

        client.DefaultRequestHeaders.Accept.Add(
        new MediaTypeWithQualityHeaderValue("application/json"));

        string json = client.GetStringAsync(url).Result;

        DataTable dt1 = (DataTable)JsonConvert.DeserializeObject(json, (typeof(DataTable)));

编辑

我在这里看了这个答案

并将我的代码更改为此

    class MyTableUtilClass
    {
        public string PtsID { get; set; }
        public DataTable Table { get; set; }
    }

        HttpClient client = new HttpClient();

        client.DefaultRequestHeaders.Accept.Add(
        new MediaTypeWithQualityHeaderValue("application/json"));

        string json = client.GetStringAsync(url).Result;

        var myUtil = JsonConvert.DeserializeObject<MyTableUtilClass>(json);
        DataTable myTable = myUtil.Table;

但是当到达这条线时

        var myUtil = JsonConvert.DeserializeObject<MyTableUtilClass>(json);

我收到这个错误

Newtonsoft.Json.JsonSerializationException: 'Error converting value "[ { "PtsID": 14061 } ]" to type 'Encoder.FrmCoder+MyTableUtilClass'. Path '', line 1, position 46.'

这和我之前遇到的错误一样..

有什么解决办法吗?

编辑

在API中我将数据表转换成JSON

所以我可以将 JSON 转换回应用程序中的数据表

这是来自 API

的代码
[Route("api/SearchSelect")]
        public string Get(string P1 = null, string P2 = null, string P3 = null, string P4 = null)
        {
            SqlConnection conn = new SqlConnection(gDBConn);
            SqlCommand cmd = new SqlCommand("SearchSelect", conn);
            cmd.CommandTimeout = 0;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@PtsName", P1));
            cmd.Parameters.Add(new SqlParameter("@PtsNo", P2));
            cmd.Parameters.Add(new SqlParameter("@RepCode", P3));
            cmd.Parameters.Add(new SqlParameter("@RepText", P4));

            try
            {
                conn.Open();

                SqlDataReader rdr = cmd.ExecuteReader();

                var dt = new DataTable();
                dt.Load(rdr);
                List<DataRow> result = dt.AsEnumerable().ToList();
                rdr.Close();
                string json = DataTableToJSON(dt);
                return json;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }

        }

    public string DataTableToJSON(DataTable dt)
    {
        string JSONString = string.Empty;
        string json = JsonConvert.SerializeObject(dt, Formatting.Indented);

        return json;
    }

您看到的问题是您的 json 不代表一个数组:它代表一个字符串。因此,错误消息(期望 [ 而得到 " )。理想情况下,尝试弄清楚原始 JSON 是如何转换为字符串的,并努力从源头上解决问题,这样您就会得到这样的 JSON 字符串:

[
  {
    "PtsID": 14061
  }
]

看看您的 API,我猜您正在使用一个框架,该框架接受返回的任何值并尝试 JSON 对其进行序列化。因此,即使您已经 JSON 将 DataTable 序列化为 string,但 string 会被您正在使用的任何 API 框架(如 WebApi)再次序列化。

您是否尝试过简单地返回 DataTable 以查看它是否被正确序列化而无需您这样做?

return dt;

如果这不起作用,您可以考虑返回类似 JArray 的内容,而不是 string:

return JArray.FromObject(dt1);

如果您无法控制源代码,则需要自行解包 JSON,如下所示:

var unwrappedJson = JsonConvert.DeserializeObject<string>(json);
DataTable dt1 = (DataTable)JsonConvert.DeserializeObject(unwrappedJson, (typeof(DataTable)));