为啥我的 MVC 控制器返回 JSON 用引号括起来且未格式化? [复制]

Posted

技术标签:

【中文标题】为啥我的 MVC 控制器返回 JSON 用引号括起来且未格式化? [复制]【英文标题】:Why is my MVC controller returning JSON wrapped in quotes and unformatted? [duplicate]为什么我的 MVC 控制器返回 JSON 用引号括起来且未格式化? [复制] 【发布时间】:2021-07-05 16:02:10 【问题描述】:

我没有得到正确的 JSON 返回。有任何想法吗?有一个更好的方法吗?我需要数据表吗?

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 有更简单的方法,我也会采用。

我没有使用实体框架。

【问题讨论】:

如果您需要使用System.Text.Json 序列化DataTable,请参阅Serialize DataSet with current version of System.Text.Json.JsonSerializer。 【参考方案1】:

return Json(object); 为您处理序列化,尝试在其中直接传递dt

【讨论】:

好的,谢谢。当我这样做时,我得到:A circular reference was detected while serializing an object of type 'System.Reflection.RuntimeModule'.【参考方案2】:

正如其他人所说,您正在序列化两次。您可以通过在控制器中使用Content 方法而不是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");

您还需要更改方法签名以返回ContentResult(或ActionResult)而不是JsonResult

【讨论】:

谢谢,这正是我最终所做的。【参考方案3】:

您将对象转换为 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 为您处理序列化,这会稍微改变您处理序列化问题的方式,例如更改大小写、自定义属性名称和处理转化。

【讨论】:

感谢您的详细解释。我现在收到此错误:A circular reference was detected while serializing an object of type 'System.Reflection.RuntimeModule'. 我将对其进行研究。

以上是关于为啥我的 MVC 控制器返回 JSON 用引号括起来且未格式化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

js与C#服务端 json数据交互

php中单引号和双引号的区别,哪个速度更快?为啥?

在spring mvc @ResponseBody中返回文字JSON字符串

如何在 ASP.NET MVC/Web 控制器中返回 JSON?

在 ASP.NET 中使用 WebAPI 或 MVC 返回 JSON

如何使用 Json.Net 从我的 WCF 休息服务(.NET 4)返回 json,而不是用引号括起来的字符串?