.Net Core WebApi中services注册的AddMvc默认使用驼峰风格(例如:firstName)来格式化Json序列化后的属性名命名风格,比较符合javascript或java的命名风格。
{
id: 1,
name: "Item1",
isComplete: false
}
按照如下方法就可以更改Json序列化后属性名的命名风格:
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序列化属性命名风格来命名时,有如下两种方式:
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
}