我正在使用 ASP.NET MVC 5在.NET Framework中进行操作。我有一个MVC控制器,它使用Newtonsoft.Json
(或 json.net)来构建一个漂亮的JSON对象。我遇到的麻烦是,当我使用JsonResult
方法Json(JSONdotnetObject)
返回我的 json 时,我最终得到的结果与我期望的结构相同,但一切都是空的JArrays
如下所示:
预期:
{
"prop": {
... some stuff ...
},
"another prop": {
... more stuff ...
}
}
实际:
[
[
... empty ...
],
[
... also empty ...
]
]
这是代码:
public ActionResult methodName(string input) {
JObject myJSON = new JObject();
// Populate myJSON with children
foreach (Thing thing in ExistingEntityFrameworkCustomClass) {
JObject newChild = new JObject();
// Add some props to newChild using newChild["propName"] = thing.Property
myJSON.Add(newChild.UniqueIdTakenFromEntity.ToString(), newChild);
}
// The JsonResult successfully populates it's Data field with myJSON before returning.
return Json(myJSON, JsonRequestBehavoir.AllowGet);
}
这不是确切的结构,但希望它能说明我正在经历的事情。我已经在 VS 中逐行浏览了程序,JsonResult
对象正确地将JObject
保存在JsonResult.Data
字段中,但是当它返回时,ASP.NET 执行的序列化出现问题,导致我丢失了漂亮的 JSON 对象:*(
我已经通过简单地从该方法返回一个JObject
而不是一个ActionResult
来解决这个问题,但这并不理想,因为我必须使用Result.ContentType
手动设置响应标头,这感觉就像一个黑客。
如果您有任何想法或可以使用更多详细信息,请告诉我。谢谢你的时间。
问题是 MVC 控制器类中的Json
方法在内部使用JavaScriptSerializer
(而不是 Json.Net),并且不知道如何正确序列化JObject
。 请尝试改用Content
方法:
public ActionResult methodName(string input) {
JObject myJSON = new JObject();
// Populate myJSON with children
return Content(myJSON.ToString(), "application/json", Encoding.UTF8);
}
或者,您可以实现自己的JsonNetResult
类,如James Newton-King的博客文章 ASP.NET MVC和 Json.NET 所示。