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