.NET Web API中
环境:
Newtonsoft.Json v9.0.0.1
1. 全局配置:
APPlication_Start()中配置以下代码, 可以将所有返回的JSon字段都转化为驼峰格式:
GlobalConfiguration.Configure.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() };
在应用全局配置之后, 如果不为JsonProperty添加NamingStrategy, 则JsonProperty上声明的Name也会被应用为驼峰格式. 可以通过下面的自定义配置实现例外配置
2. 自定义配置:
继承NamingStrategy后, 实现方法GetPropertyName就可以实现例外配置, 最终返回的Json字符串格式就是这个方法GetPropertyName的返回值.
3. 关于自定义配置的解析:
调用路径:
DefaultContractResolver..CreateObjectContract()->CreateProperties()->遍历Member, 调用CreateProperty(): JsonProperty property = CreateProperty(member, memberSerialization);->SetPropertySettingsFromAttributes()->
在方法SetPropertySettingsFromAttributes()中,
1. 如果存在JsonPropertyAttribute/JsonContainerAttribute特性, 以及属性NamingStrategy->调用方法GetPropertyName();
2. 否则调用ResolvePropertyName, 也就是DefaultContractResolver中自带的NamingStrategy属性(CamelCasePropertyNamesContractResolver就实现了自己的NamingStrategy, DefaultContractResolver的NamingStrategy为空, 但是可以在外部赋值).
3. 也就是说, 可以给DefaultContractResolver赋值来自定义格式:
var resolver = new DefaultContractResolver(); resolver.NamingStrategy = new TestStrategy(); config.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings() { ContractResolver = resolver };
调用namingStrategy源代码:
if (namingStrategy != null) { property.PropertyName = namingStrategy.GetPropertyName(mappedName, hasSpecifiedName); } else { property.PropertyName = ResolvePropertyName(mappedName); }
我的简单实例:

public class Strategy4JsonProperty : NamingStrategy { protected override string ResolvePropertyName(string name) { throw new NotImplementedException(); } public override string GetPropertyName(string name, bool hasSpecifiedName) { return name + "!!!"; } } [JsonObject(NamingStrategyType = typeof(Strategy4JsonProperty))] public partial class ResearchList { public Guid Id { get; set; } public string Name { get; set; } } public partial class TEST { [JsonProperty(NamingStrategyType = typeof(Strategy4JsonProperty))] public Guid Id { get; set; } public string Name { get; set; } }
结论: 外部用全局配置, 内部使用特性加策略, 可以实现不同类型的Json返回格式.