【问题标题】:JSON to datatable causing this error in c# "Unexpected JSON token > when reading DataTable. Expected StartArray, got String. Path"JSON 到数据表在 c# 中导致此错误“读取 DataTable 时出现意外的 JSON 令牌>。预期的 StartArray,得到了字符串。路径”
【发布时间】:2021-05-16 02:51:41
【问题描述】:

我从 API 中提取 JSON 代码

没有问题

JSON 输出就是这个字符串

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

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

使用这行代码

这是我的代码

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

我收到此错误

Newtonsoft.Json.JsonSerializationException: '意外的 JSON 令牌 读取数据表时。预期 StartArray,得到字符串。路径'',行 1,第 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)));

编辑

我在这里查看了这个答案

Deserialize a nested DataSet from Json String with Json.NET

并将我的代码更改为此

    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: '错误转换值 "[ { "PtsID": 14061 } ]" 输入 'Encoder.FrmCoder+MyTableUtilClass'。路径 '',第 1 行,位置 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;
    }

【问题讨论】:

  • 我不知道为什么有人会否决您的问题。我已经从 -1 投票到 0 :)

标签: c# json datatable


【解决方案1】:

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

[
  {
    "PtsID": 14061
  }
]

查看您的 API,我猜您正在使用一个框架,该框架采用返回的任何值并尝试对其进行 JSON 序列化。因此,即使您已将 DataTable JSON 序列化为 stringstring 仍会被您使用的任何 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)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2021-02-09
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    相关资源
    最近更新 更多