.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返回格式.