.Net Core WebApi更改Json序列化后属性名的命名风格

.Net Core WebApi中services注册的AddMvc默认使用驼峰风格(例如:firstName)来格式化Json序列化后的属性名命名风格,比较符合javascript或java的命名风格。

{
    id: 1,
    name: "Item1",
    isComplete: false
}

按照如下方法就可以更改Json序列化后属性名的命名风格:

  1. 找到Startup.cs中的ConfigureServices方法里的services.AddMvc()。
  2. 在services.AddMvc()后添加如下代码:
services.AddMvc()
            .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());

其中DefaultContractResolver类是在Newtonsoft.Json.Serialization命名空间下。
通过以上修改,我们执行WebApi项目后发现返回的Json字符串已经按照Model中的属性名进行命名了。

{
    Id: 1,
    name: "Item1",
    IsComplete: false
}

当我们需要按照.Net Core WebApi的默认Json序列化属性命名风格来命名时,有如下两种方式:

  • 删除AddJsonOptions这一段代码。
  • 将上述代码修改为:
services.AddMvc()
            .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver());

有人会问,如果我需要返回的Json的命名风格既不是驼峰风格,也不是Model属性中的属性名,需要怎样实现呢?
通过对象继承或接口实现关系,我们发现,CamelCasePropertyNamesContractResolver类是继承自DefaultContractResolver,而DefaultContractResolver类是实现了IContractResolver接口的。
同理,我们如果对返回的Json有特殊的属性名命名风格,可以自己创建一个类继承自DefaultContractResolver,并将这个类的实例赋值给options.SerializerSettings.ContractResolver;或者有更深层次的需求时,我们可以创建一个类实现IContractResolver接口来达到目的。
以下是创建特殊风格的示例,要求属性的所有单词均使用小写字母:

using Newtonsoft.Json.Serialization;

namespace TodoApi.Models
{
    public class LowerCasePropertyNamesContractResolver : DefaultContractResolver
    {
        protected override string ResolvePropertyName(string propertyName)
        {
            return propertyName.ToLower();
        }
    }
}

同时将services.AddMvc()后的代码修改为:

services.AddMvc()
            .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new LowerCasePropertyNamesContractResolver());

通过以上修改,我们执行WebApi项目后发现返回的Json字符串已经按照属性的所有单词均使用小写字母进行命名了。

{
    id: 1,
    name: "Item1",
    iscomplete: false
}

你可能感兴趣的:(.Net Core WebApi更改Json序列化后属性名的命名风格)