gpt4 book ai didi

asp.net-web-api - 针对每个 Web API 请求设置 JSON CamelCase

转载 作者:行者123 更新时间:2023-12-02 18:46:35 26 4
gpt4 key购买 nike

Web API 使用 Json.Net 格式化程序来序列化其 JSON 响应,这使您可以在启动时轻松地为整个应用程序自定义生成的 JSON 格式:

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

这使您可以解决首选 PascalCase 的 C# 语法和首选 CamelCase 的基于 javascript 的客户端之间的问题。然而,在 API 上进行全局设置而不考虑客户端请求实际上来自谁,似乎假设 API 将只有 1 种类型的客户端,并且您为 API 设置的任何内容都必须如此。

由于我的 API 具有多种客户端类型(javascript、iOS、Android、C#),我正在寻找一种每个请求设置 Json.Net SerializerSettings 的方法,以便客户端可以请求其通过某种方式(可能是自定义 header 或 queryString 参数)首选格式来覆盖默认值。

在 Web API 中设置每个请求 Json.Net SerializerSettings 的最佳方法是什么?

最佳答案

在 Rick Strahl 的 blog post 的帮助下在创建 JSONP 媒体类型格式化程序时,我提出了一个解决方案,允许 API 根据客户端请求动态地从 CamelCase 切换到 PascalCase。

创建一个派生自默认 JsonMediaTypeFormatter 的 MediaTypeFormatter 并重写 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 参数作为构造函数参数,以便我们可以继续使用 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));

现在, header 值为 X-JsonResponseCase: Camel 的请求将在响应中接收驼峰式大小写属性名称。显然,您可以更改该逻辑以使用您喜欢的任何 header 或查询字符串参数。

关于asp.net-web-api - 针对每个 Web API 请求设置 JSON CamelCase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33473620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com