我将camel外壳配置为Newtonsoft库的默认JSON输出。在Application_Start期间调用以下行:
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
对WebAPI的所有javascript REST调用(使用WebAPI 2)都可以正常工作,并将驼峰式JSON字符串返回给客户端。
现在,我在我的一个网页上使用了jTable控件(http://www.jtable.org),此控件要求在正确大小写中返回JSON有效负载。 所以问题是 如果通过Application_Start的默认配置设置为camel case而不更改全局默认设置,我怎么可选择更改WebAPI以返回Proper Case JSON有效负载? / strong>我需要为应用程序中的这一个WebAPI调用返回正确的案例JSON有效负载。
我已尝试[http://fizzylogic.nl/2014/07/30/changing-the-casing-of-json-properties-in-asp-dot-net-web-api/]这个,但我无法启动ActionFilterAttribute.OnActionExecuting。所以解决方案不起作用。
我还在WebAPI方法中添加了以下代码行
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new JsonContractResolver(new JsonMediaTypeFormatter());
这样可行,但Proper Case现在成为其他WebAPI调用的默认格式。
这是WebAPI代码段
public JTableDtoImpl Get(int id, int jtStartIndex = 0, int jtPageSize = 0, string jtSorting = "") {
List<MobileOrderModel> orders = _svc.GetMobileOrders(id);
var dto = new JTableDtoMobileOrdersImpl(orders, jtStartIndex, jtPageSize) {
Message = string.Format("DataSource:{0}", _svc.DataSource)
};
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new JsonContractResolver(new JsonMediaTypeFormatter());
return dto;
}
这里的问题是我现在无法恢复到默认的驼峰大小写格式,因为那时方法已经返回。
还有其他建议吗?
答案 0 :(得分:1)
您可以使用the overload that takes a MediaTypeFormatter致电Request.CreateResponse
并传递new JsonMediaTypeFormatter()
,与您在全球范围内设置方式类似,但专门针对此方法。当然,您可以指定所需的SerializerSettings
。最好在控制器中保留它的私有静态实例,这样你每次都不会new
。
答案 1 :(得分:0)
您需要显式序列化JSON,而不是返回一个对象并让WebApi为您序列化它。尝试类似:
public JSonResult Get(int id, int jtStartIndex = 0, int jtPageSize = 0, string jtSorting = "")
{
List<MobileOrderModel> orders = _svc.GetMobileOrders(id);
var dto = new JTableDtoMobileOrdersImpl(orders, jtStartIndex, jtPageSize) {
Message = string.Format("DataSource:{0}", _svc.DataSource)
};
return Json(dto, JsonRequestBehavior.AllowGet); // This serializes explicitly, before WebApi invokes the default serializer
}
答案 2 :(得分:0)
这是我最终的WebAPI方法,它以我需要的方式工作。太糟糕了,我无法通过Newtonsoft.Json库获得此功能,因此该方法将返回业务对象而不是响应对象。为清楚起见,我从课程中删除了代码。 (即:追踪,评论等)。
public class MobileOrdersController : ApiController {
private static readonly MobileOrdersService _svc = new MobileOrdersService();
private static readonly MediaTypeFormatter _properCaseFormatter = new JsonMediaTypeFormatter{
SerializerSettings = new JsonSerializerSettings {
ContractResolver = new DefaultContractResolver()
}
};
[Authorize][HttpGet]
public HttpResponseMessage GetCustomerMobileOrders(int id, int jtStartIndex = 0, int jtPageSize = 0, string jtSorting = "") {
try {
List<MobileOrderModel> orders = _svc.GetMobileOrders(id);
var dto = new JTableDtoMobileOrdersImpl(orders, jtStartIndex, jtPageSize) {
Message = string.Format("DataSource:{0}", _svc.DataSource)
};
return Request.CreateResponse(HttpStatusCode.OK, dto, _properCaseFormatter);
} catch (Exception ex) {
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
}
}
}
以下是我使用OkNegotiatedContentResult&lt;&gt;的解决方案因为我使用的是WebAPI 2,所以David建议。
public class MobileOrdersController : ApiController {
private static readonly MobileOrdersService _svc = new MobileOrdersService();
private static readonly IContentNegotiator _conneg = GlobalConfiguration.Configuration.Services.GetContentNegotiator();
private static readonly IEnumerable<JsonMediaTypeFormatter> _mediaTypeFormatters = new[] {
new JsonMediaTypeFormatter {
SerializerSettings = new JsonSerializerSettings {
ContractResolver = new DefaultContractResolver()
}
}
};
[Authorize][HttpGet]
public IHttpActionResult GetCustomerMobileOrders(int id, int jtStartIndex = 0, int jtPageSize = 0, string jtSorting = "") {
try {
List<MobileOrderModel> orders = _svc.GetMobileOrders(id);
var dto = new JTableDtoMobileOrdersImpl(orders, jtStartIndex, jtPageSize) {
Message = string.Format("DataSource:{0}", _svc.DataSource)
};
return new OkNegotiatedContentResult<JTableDtoMobileOrdersImpl>(dto, _conneg, Request, _mediaTypeFormatters);
} catch (Exception ex) {
return new ExceptionResult(ex, this);
}
}
}