Asp.net-Mvc
將 JSON.NET JObject 轉換為 JsonResult 的異常
我有一個 JSON.NET JObject,其資料結構如下:
{ "foo" : { "bar": "baz" } }我正在嘗試將其轉換為 ASP.NET MVC JsonResult,如下所示:
JObject someData = ...; JsonResult jsonResult = Json(someData, "application/json", JsonRequestBehavior.AllowGet);當我這樣做時,我得到以下異常:
使用者程式碼未處理 InvalidOperationException。無法訪問 Newtonsoft.Json.Linq.JValue 上的子值。
我有一個解決方法,因為我可以遍歷 JObject 的所有屬性,並將它們解析為一個通用對象,如下所示:
JsonResult jsonResult = Json(new { key1 = value1, key2 = value2, ... });但是,這似乎容易出錯,並且是解決此問題的一種不必要的非通用方法。有什麼方法可以更有效地做到這一點,希望使用 JSON.NET 或 ASP.NET MVC 中的一些內置方法?
如果您有一個 JObject,我建議您編寫一個自定義ActionResult,它使用 JSON.NET 直接將此 JObject 序列化到響應流中。它更符合 MVC 模式的精神:
public ActionResult Foo() { JObject someData = ...; return new JSONNetResult(someData); }在哪裡:
public class JSONNetResult: ActionResult { private readonly JObject _data; public JSONNetResult(JObject data) { _data = data; } public override void ExecuteResult(ControllerContext context) { var response = context.HttpContext.Response; response.ContentType = "application/json"; response.Write(_data.ToString(Newtonsoft.Json.Formatting.None)); } }擁有一個 JObject 似乎有點矯枉過正,您可以使用 .NET JavaScriptSerializer 將其序列化為 JSON,該 JavaScriptSerializer 更常與某些模型類結合使用。