加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-web-api – 根据Web API请求设置JSON CamelCase

发布时间:2020-12-16 07:29:41 所属栏目:asp.Net 来源:网络整理
导读:Web API使用Json.Net格式化程序来序列化其 JSON响应,这允许您在启动时使用以下内容非常轻松地为整个应用程序自定义生成的JSON的格式: config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(
Web API使用Json.Net格式化程序来序列化其 JSON响应,这允许您在启动时使用以下内容非常轻松地为整个应用程序自定义生成的JSON的格式:

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

这允许您解决C#语法之间的问题,首选PascalCase和基于javascript的客户端更喜欢camelCase.然而,在不考虑客户端请求实际来自哪个人的情况下在API上全局设置它似乎假设API将只有一种类型的客户端,并且您为API设置的任何内容都是必须的.

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

在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参数作为构造函数参数,以便我们可以继续使用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));

现在具有标头值X-JsonResponseCase:Camel的请求将在响应中接收camel case属性名称.显然,您可以更改该逻辑以使用您喜欢的任何标头或查询字符串参数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读