2015-12-04 3 views
3

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

[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 внутри действия? Каков правильный тип возврата действия?

+0

возвращение JSon (JsonConvert.SerializeObject (....)); –

+0

Почему вы хотите явно вызывать Json.NET, если он уже будет вызываться MVC? О, подождите - Json.NET является стандартным форматом для ASP.NET WebApi, а не ASP.NET MVC. Сожалею. См. Http://stackoverflow.com/questions/14591750/setting-the-default-json-serializer-in-asp-net-mvc –

ответ

3

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

return Content(JsonConvert.SerializeObject(...), "application/json"); 
1
public string GetAccount() 
{ 
    Account account = new Account 
    { 
     Email = "[email protected]", 
     Active = true, 
     CreatedDate = new DateTime(2013, 1, 20, 0, 0, 0, DateTimeKind.Utc), 
     Roles = new List<string> 
     { 
      "User", 
      "Admin" 
     } 
    }; 

    string json = JsonConvert.SerializeObject(account, Formatting.Indented); 

    return json; 
} 

или

public ActionResult Movies() 
{ 
    var movies = new List<object>(); 

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

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

// GET: api/portfolio' 
    [HttpGet] 
    public IHttpActionResult Get() 
    { 
     List<string> somethings = DataStore.GetSomeThings(); 

     //Return list and return ok (HTTP 200)    
     return Ok(somethings); 
    } 
1

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

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

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

Объекта Extension (мой конкретный случай, я сериализация с 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(); 
    } 

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

Смежные вопросы