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)));
我从 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)));