Преобразование исключений JSON.NET Объект задания в JsonResult

#asp.net-mvc #json #json.net

#asp.net-mvc #json #json.net

Вопрос:

У меня есть JSON.NET JObject с данными, структурированными следующим образом:

 {
    "foo" : {
        "bar": "baz"
    }
}
  

Я пытаюсь преобразовать его в ASP.NET MVC jsonрезультат следующим образом:

 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?

Комментарии:

1. Почему бы просто не сериализовать ваш объект с помощью JSON.net , а затем записать это как ContentResult?

Ответ №1:

Если у вас есть JObject, я бы порекомендовал вам написать пользовательский ActionResult, который напрямую сериализует этот JObject с помощью JSON.NET в поток ответов. Это больше в духе шаблона 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, который вы бы сериализовали в JSON с помощью .NET JavaScriptSerializer, который чаще используется в сочетании с некоторыми классами моделей.

Комментарии:

1. Спасибо, используя ваш ввод, я нашел следующую ссылку автора: james.newtonking.com/archive/2008/10/16 /… , что дало мне то, что я искал.

2. Но почему код, приведенный в вопросе, не работает?