Asp.net-Mvc

將 JSON.NET JObject 轉換為 JsonResult 的異常

  • April 6, 2011

我有一個 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 更常與某些模型類結合使用。

引用自:https://stackoverflow.com/questions/5572608