Cas*_*sey 5 json.net asp.net-web-api
Web API使用Json.Net格式化程序来序列化其JSON响应,这允许您在启动时使用以下内容非常轻松地为整个应用程序自定义生成的JSON的格式:
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
Run Code Online (Sandbox Code Playgroud)
这允许您解决C#语法之间的问题,首选PascalCase和基于javascript的客户端更喜欢camelCase.然而,在不考虑客户端请求实际来自哪个人的情况下在API上全局设置它似乎假设API将只有一种类型的客户端,并且您为API设置的任何内容都是必须的.
我的API有多种客户端类型(javascript,iOS,Android,C#),我正在寻找一种方法来为每个请求设置Json.Net SerializerSettings ,以便客户端可以通过某种方式请求他们的首选格式(可能是自定义头或queryString param)来覆盖默认值.
在Web API中设置每个请求Json.Net SerializerSettings的最佳方法是什么?
Cas*_*sey 10
在Rick Strahl 关于创建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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我将JsonSerializerSettings参数作为构造函数参数,以便我们可以继续使用WebApiConfig来设置我们想要使用的任何其他json设置,并将它们仍然应用于此处.
然后在WebApiConfig中注册此格式化程序:
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));
Run Code Online (Sandbox Code Playgroud)
现在具有标头值的请求X-JsonResponseCase: Camel将在响应中接收camel case属性名称.显然,您可以更改该逻辑以使用您喜欢的任何标头或查询字符串参数.
| 归档时间: |
|
| 查看次数: |
1604 次 |
| 最近记录: |