我正在使用 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 Controller 类中的
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 中所示。
你需要施展。这是因为 JObject 与所使用的序列化程序不兼容。 但是经过数小时的努力你可以获得 MVC JsonResult 序列化
myJSON.ToObject<Dictionary<string, object>>()
如果它是一个JObject并且如果它是一个JArray你需要myJSON.ToObject<List<Dictionary<string, object>>>()