在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));
現在請求。顯然你可以改變這個邏輯來使用你喜歡的任何頭文件或查詢字符串參數。