为什么我的 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