#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. Но почему код, приведенный в вопросе, не работает?