为啥我的 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 用引号括起来且未格式化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
在spring mvc @ResponseBody中返回文字JSON字符串
如何在 ASP.NET MVC/Web 控制器中返回 JSON?