为什么我的 MVC 控制器返回 JSON 用引号括起来并且未格式化?
Why is my MVC controller returning JSON wrapped in quotes and unformatted?
我没有得到合适的 JSON return。有任何想法吗?有一个更好的方法吗?我需要数据表吗?
public JsonResult ReportData(string pdfID)
{
string sqlConnectionString = @"ConnectThatThangStuff;";
string queryString = @"SELECT stuffs FROM Thingy;";
var json = string.Empty;
using (SqlConnection connection = new SqlConnection(sqlConnectionString))
{
SqlCommand cmd = new SqlCommand(queryString, connection);
connection.Open();
SqlDataReader reader = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(reader);
json = JsonConvert.SerializeObject(dt);
}
return Json(json, JsonRequestBehavior.AllowGet);
}
我的努力得到了什么?这个废话:
"[{\"transid\":1111,\"FromEmailAddress\":\"email@email.com\",\"Name\":\"bob doe\",\"EmailAddress\":\"email@email.com\",\"CreateDt\":\"4/08/2021\",\"ExpirationDt\":\"5/08/2021\",\"Status\":\"Complete\",\"FinalDt\":\"4/09/2021\"},{\"transid\":22222,\"FromEmailAddress\":\"email@email.com\",\"Name\":\"bill doe\",\"EmailAddress\":\"email@email.com\",\"CreateDt\":\"4/08/2021\",\"ExpirationDt\":\"5/08/2021\",\"Status\":\"Ready\",\"FinalDt\":null}]"
我需要 JOSN 在我看来构建一个 jQuery DataTable。如果从 SQL Query -> jQuery DataTable 有更简单的方法,我也会采用。
我没有使用 Entity Framework。
return Json(object);
为您处理序列化,尝试直接在其中传递 dt
您将对象转换为 JSON 两次:
json = JsonConvert.SerializeObject(dt);
return Json(json, JsonRequestBehavior.AllowGet);
事实上,如果你仔细观察,你会发现你的 json
变量是一个字符串。
当您将字符串传递给 Json
方法时,它会将字符串转换为 json,这就是您得到的结果。
我建议您跳过对 JsonConvert.Serialize
的调用,直接调用 Json(dt)
。
不过,有一点建议:JsonConvert.Serialize
正在调用 Newtonsoft Json (JSON.NET) 进行序列化。通过直接调用 Json,ASP.Net 将处理序列化,如果配置不当,您可能会让 System.Text.Json
为您处理序列化,这会稍微改变您处理序列化问题的方式例如更改大小写、自定义 属性 名称和处理转换。
正如其他人所说,您正在连载两次。您可以通过在控制器中使用 Content
method instead of the Json
方法来解决此问题,同时避免循环引用问题:
// serialize using Json.Net (handles DataTable cleanly)
json = JsonConvert.SerializeObject(dt);
// Return the already-serialized JSON string with a content type of application/json
return Content(json, "application/json");
您还需要将方法签名更改为 return a ContentResult
(or ActionResult
) instead of a JsonResult
。
我没有得到合适的 JSON return。有任何想法吗?有一个更好的方法吗?我需要数据表吗?
public JsonResult ReportData(string pdfID)
{
string sqlConnectionString = @"ConnectThatThangStuff;";
string queryString = @"SELECT stuffs FROM Thingy;";
var json = string.Empty;
using (SqlConnection connection = new SqlConnection(sqlConnectionString))
{
SqlCommand cmd = new SqlCommand(queryString, connection);
connection.Open();
SqlDataReader reader = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(reader);
json = JsonConvert.SerializeObject(dt);
}
return Json(json, JsonRequestBehavior.AllowGet);
}
我的努力得到了什么?这个废话:
"[{\"transid\":1111,\"FromEmailAddress\":\"email@email.com\",\"Name\":\"bob doe\",\"EmailAddress\":\"email@email.com\",\"CreateDt\":\"4/08/2021\",\"ExpirationDt\":\"5/08/2021\",\"Status\":\"Complete\",\"FinalDt\":\"4/09/2021\"},{\"transid\":22222,\"FromEmailAddress\":\"email@email.com\",\"Name\":\"bill doe\",\"EmailAddress\":\"email@email.com\",\"CreateDt\":\"4/08/2021\",\"ExpirationDt\":\"5/08/2021\",\"Status\":\"Ready\",\"FinalDt\":null}]"
我需要 JOSN 在我看来构建一个 jQuery DataTable。如果从 SQL Query -> jQuery DataTable 有更简单的方法,我也会采用。
我没有使用 Entity Framework。
return Json(object);
为您处理序列化,尝试直接在其中传递 dt
您将对象转换为 JSON 两次:
json = JsonConvert.SerializeObject(dt);
return Json(json, JsonRequestBehavior.AllowGet);
事实上,如果你仔细观察,你会发现你的 json
变量是一个字符串。
当您将字符串传递给 Json
方法时,它会将字符串转换为 json,这就是您得到的结果。
我建议您跳过对 JsonConvert.Serialize
的调用,直接调用 Json(dt)
。
不过,有一点建议:JsonConvert.Serialize
正在调用 Newtonsoft Json (JSON.NET) 进行序列化。通过直接调用 Json,ASP.Net 将处理序列化,如果配置不当,您可能会让 System.Text.Json
为您处理序列化,这会稍微改变您处理序列化问题的方式例如更改大小写、自定义 属性 名称和处理转换。
正如其他人所说,您正在连载两次。您可以通过在控制器中使用 Content
method instead of the Json
方法来解决此问题,同时避免循环引用问题:
// serialize using Json.Net (handles DataTable cleanly)
json = JsonConvert.SerializeObject(dt);
// Return the already-serialized JSON string with a content type of application/json
return Content(json, "application/json");
您还需要将方法签名更改为 return a ContentResult
(or ActionResult
) instead of a JsonResult
。