ASP MVC 5 и Json.NET: тип возвращаемого действия

Я использую ASP MVC 5. У меня есть действие в controllerе, который возвращает объект json:

[HttpGet] public JsonResult GetUsers() { return Json(....., JsonRequestBehavior.AllowGet); } 

Теперь я хочу использовать библиотеку JSON.Net, и я вижу, что в ASP MVC 5 еще нет. По сути, я могу написать

 using Newtonsoft.Json; 

без импорта библиотеки из NuGet.

Теперь я попытался написать:

 public JsonResult GetUsers() { return JsonConvert.SerializeObject(....); } 

Но во время компиляции у меня ошибка: я не могу преобразовать строку возвращаемого типа в JsonResult. Как я могу использовать Json.NET внутри действия? Каков правильный тип возврата действия?

Вы можете использовать ContentResult вместо этого:

 return Content(JsonConvert.SerializeObject(...), "application/json"); 

Я предпочитаю создавать расширение объекта для создания пользовательского результата действия, и это причина моего выбора …

Расширение объекта (в моем конкретном случае, я сериализуюсь с помощью newtonsoft и игнорирую нулевые значения:

 public static class NewtonsoftJsonExtensions { public static ActionResult ToJsonResult(this object obj) { var content = new ContentResult(); content.Content = JsonConvert.SerializeObject(obj, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); content.ContentType = "application/json"; return content; } } 

И он очень прост в использовании, sinse его расширяемый для любого объекта, поэтому для использования вам просто нужно:

  public ActionResult someRoute() { //Create any type of object and populate var myReturnObj = someObj; return myReturnObj.ToJsonResult(); } 

надеюсь, что это будет полезно для всех

 public string GetAccount() { Account account = new Account { Email = "james@example.com", Active = true, CreatedDate = new DateTime(2013, 1, 20, 0, 0, 0, DateTimeKind.Utc), Roles = new List { "User", "Admin" } }; string json = JsonConvert.SerializeObject(account, Formatting.Indented); return json; } 

или же

 public ActionResult Movies() { var movies = new List(); movies.Add(new { Title = "Ghostbusters", Genre = "Comedy", Year = 1984 }); movies.Add(new { Title = "Gone with Wind", Genre = "Drama", Year = 1939 }); movies.Add(new { Title = "Star Wars", Genre = "Science Fiction", Year = 1977 }); return Json(movies, JsonRequestBehavior.AllowGet); } 

Вам в основном нужно написать пользовательский ActionResult, указанный здесь в этом сообщении

 [HttpGet] public JsonResult GetUsers() { JObject someData = ...; return new JSONNetResult(someData); } 

Функция JSONNetResult:

 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)); } } 

Возможно, вы захотите рассмотреть возможность использования IHttpActionResult, так как это автоматически даст вам возможность сериализации (или вы можете сделать это самостоятельно), но также позволит вам управлять возвращенным кодом ошибки, если в вашей функции возникают ошибки, исключения или другие вещи.

  // GET: api/portfolio' [HttpGet] public IHttpActionResult Get() { List somethings = DataStore.GetSomeThings(); //Return list and return ok (HTTP 200) return Ok(somethings); }