【问题标题】:ASP MVC 5 and Json.NET: action return typeASP MVC 5 和 Json.NET:动作返回类型
【发布时间】:2021-03-11 22:40:10
【问题描述】:

我正在使用 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?动作的正确返回类型是什么?

【问题讨论】:

  • return Json(JsonConvert.SerializeObject(....));
  • 如果 Json.NET 已经被 MVC 调用,为什么还要显式调用它?哦等等 - Json.NET 是 ASP.NET WebApi 的默认格式化程序,而不是 ASP.NET MVC。对不起。见stackoverflow.com/questions/14591750/…

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


【解决方案1】:

我更喜欢创建一个 object 扩展,以生成自定义 ActionResult,因为它可以在返回时内联应用于任何对象

波纹管扩展使用Newtonsoft Nuget 来序列化忽略空属性的对象

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】:

    您可以像这样使用ContentResult

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

    【讨论】:

      【解决方案3】:
      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);
      }
      

      【讨论】:

      • Json 在 MVC 5 中不使用 Json.net
      【解决方案4】:

      您基本上需要编写一个自定义的 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));
           }
       }
      

      【讨论】:

        【解决方案5】:

        您可能需要考虑使用 IHttpActionResult,因为这会给您带来自动序列化的好处(或者您可以自己做),而且还允许您控制返回的错误代码,以防万一您的系统中发生错误、异常或其他事情功能。

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

        【讨论】:

          猜你喜欢
          • 2013-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-20
          • 1970-01-01
          • 2010-10-19
          • 2013-06-12
          相关资源
          最近更新 更多