bea*_*ous 11 serialization json asp.net-web-api
我正在尝试从ASP.Net Web API 2控制器返回camel cased JSON.我创建了一个新的Web应用程序,其中只包含ASP.Net MVC和Web API位.我像这样劫持了ValuesController:
public class ValuesController : ApiController
{
public class Thing
{
public int Id { get; set; }
public string FirstName { get; set; }
public string ISBN { get; set; }
public DateTime ReleaseDate { get; set; }
public string[] Tags { get; set; }
}
// GET api/values
public IHttpActionResult Get()
{
var thing = new Thing
{
Id = 123,
FirstName = "Brian",
ISBN = "ABC213",
ReleaseDate = DateTime.Now,
Tags = new string[] { "A", "B", "C", "D"}
};
return Json(thing);
}
}
Run Code Online (Sandbox Code Playgroud)
在IE中运行,我得到以下结果:
{"Id":123,"FirstName":"Brian","ISBN":"ABC213","ReleaseDate":"2014-10-20T16:26:33.6810554-04:00","Tags":["A","B","C","D"]}
Run Code Online (Sandbox Code Playgroud)
按照K. Scott Allen关于这个主题的帖子,我在WebApiConfig.cs文件中的Register方法中添加了以下内容:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
settings.Formatting = Formatting.Indented;
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
Run Code Online (Sandbox Code Playgroud)
但是,我仍然得到同样的结果,在我的结果中.有什么我想念的吗?我尝试过其他一些方法,但还没有任何效果.
Oma*_*ani 15
在WebApiConfig.c中,请确保添加这两行
// Serialize with camelCase formatter for JSON.
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
Run Code Online (Sandbox Code Playgroud)
确保您安装了Newtonsoft库.
希望有所帮助.
看起来主要的问题是我使用的是JsonResult快捷方式Json()动作结果方法:
public IHttpActionResult Get([FromUri] string domain, [FromUri] string username)
{
var authInfo = BLL.GetAuthenticationInfo(domain, username);
return Json(authInfo);
}
Run Code Online (Sandbox Code Playgroud)
它显然可以完全控制格式化结果.如果我切换到返回HttpResponseMessage然后它按预期工作:
public HttpResponseMessage Get([FromUri] string domain, [FromUri] string username)
{
var authInfo = BLL.GetAuthenticationInfo(domain, username);
return Request.CreateResponse(HttpStatusCode.OK, authInfo);
}
Run Code Online (Sandbox Code Playgroud)
我最终使用了WebApiConfig文件中的代码块,正如Omar.Alani所建议的那样(与我在OP中使用的代码相比更长).但真正的罪魁祸首是JsonResult行动方法.我希望这有助于其他人.
您需要使用OK()而不是Json()在操作方法中。
// GET api/values
public IHttpActionResult Get()
{
var thing = new Thing
{
Id = 123,
FirstName = "Brian",
ISBN = "ABC213",
ReleaseDate = DateTime.Now,
Tags = new string[] { "A", "B", "C", "D"}
};
// Use 'Ok()' instead of 'Json()'
return Ok(thing);
}
Run Code Online (Sandbox Code Playgroud)