【问题标题】:Exception converting JSON.NET JObject to JsonResult将 JSON.NET JObject 转换为 JsonResult 的异常
【发布时间】:2011-04-06 20:35:53
【问题描述】:

我有一个 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 中的一些内置方法?

【问题讨论】:

  • 为什么不简单地使用 JSON.net 序列化您的对象,然后将其写为 ContentResult?

标签: asp.net-mvc json json.net


【解决方案1】:

如果您有 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,后者更常与某些模型类结合使用。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多