设置JSON驼峰
的Web API使用Json.Net格式化程序序列化JSON的响应,它允许您在启动时使用很方便地自定义生成的JSON格式为整个应用程序:设置JSON驼峰
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
这使您可以解决C#语法偏好PascalCase和喜欢使用camelCase的基于JavaScript的客户端之间的问题。但是,如果在API上全局设置此值,而不考虑客户端请求实际来自谁,似乎认为API将只有一种类型的客户端,并且您为API设置的任何内容都是其必须的方式。
有多个客户端类型为我的API(JavaScript的,的iOS,安卓,C#),我正在寻找一种方法来设置Json.Net SerializerSettings 每个请求,使得客户端可以通过一些要求他们的首选格式意味着(可能是一个自定义头或queryString参数)来覆盖默认值。
在Web API中设置每个请求Json.Net SerializerSettings的最佳方式是什么?
在Rick Strahl的blog post关于创建JSONP媒体类型格式化程序的帮助下,我提出了一个解决方案,允许API根据客户机请求动态地从camelCase切换到PascalCase。
创建一个MediaTypeFormatter,它从默认的JsonMediaTypeFormatter派生并重写GetPerRequestFormatterInstance方法。在这里你可以实现你的逻辑来根据请求设置串行器设置。
public class JsonPropertyCaseFormatter : JsonMediaTypeFormatter
{
private readonly JsonSerializerSettings globalSerializerSettings;
public JsonPropertyCaseFormatter(JsonSerializerSettings globalSerializerSettings)
{
this.globalSerializerSettings = globalSerializerSettings;
SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/javascript"));
}
public override MediaTypeFormatter GetPerRequestFormatterInstance(
Type type,
HttpRequestMessage request,
MediaTypeHeaderValue mediaType)
{
var formatter = new JsonMediaTypeFormatter
{
SerializerSettings = globalSerializerSettings
};
IEnumerable<string> values;
var result = request.Headers.TryGetValues("X-JsonResponseCase", out values)
? values.First()
: "Pascal";
formatter.SerializerSettings.ContractResolver =
result.Equals("Camel", StringComparison.InvariantCultureIgnoreCase)
? new CamelCasePropertyNamesContractResolver()
: new DefaultContractResolver();
return formatter;
}
}
注意,我采取JsonSerializerSettings参数的构造函数PARAM这样我们就可以继续使用WebApiConfig设置任何其他JSON的设置,我们要使用,让他们在这里仍然适用。
为了然后注册此格式,在您的WebApiConfig:具有的X-JsonResponseCase: Camel
头值将在响应收到驼峰属性名称
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter());
config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
config.Formatters.Insert(0,
new JsonPropertyCaseFormatter(config.Formatters.JsonFormatter.SerializerSettings));
现在请求。显然你可以改变这个逻辑来使用你喜欢的任何头文件或查询字符串参数。