ASP MVC 5和Json.NET:动作返回类型

时间:2015-12-04 14:53:26

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

我正在使用ASP MVC 5.我在控制器中有一个返回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?动作的正确返回类型是什么?

5 个答案:

答案 0 :(得分:3)

您可以使用ContentResult代替:

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

答案 1 :(得分:3)

我更喜欢创建一个对象扩展来创建一个自定义的Action Result,这就是我选择的原因......

对象扩展(我的具体情况,我使用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;
    }
}

它非常容易使用,它可以扩展到任何对象,所以使用它只需要它:

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

希望它对任何人都有帮助

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您基本上需要编写此post

中指示的自定义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));
     }
 }

答案 4 :(得分:0)

您可能需要考虑使用IHttpActionResult,因为这样可以自动为您提供序列化的好处(或者您可以自己完成),但也允许您控制返回的错误代码,以防出现错误,异常或其他事情。功能

    ...
    self.itemExpanded.connect(self.onItemExpanded)

def onItemExpanded(self,item):
    print("stuff")