如果您可以修改您的类型以添加Json.NET serialization attributes,最简单的做法是将[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))] 添加到您的CaseToChange 类型:
[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
public class CaseToChange
{
public string StringProperty { get; set; } //Change to camelCase
public SomeOtherType OtherTypeProperty { get; set; } //Change name of this to camelCase but not property name of "SomeOtherType"
}
(或者,如果您使用的是早于 9.0.1 的 Json.NET 版本,请将 [JsonProperty("camelCaseName")] 添加到每个属性中,如 this answer。)
如果您无法修改类型并且必须仅通过序列化程序设置对CaseToChange 的属性进行驼峰式大小写,您可以创建一个custom contract resolver,它返回CaseToChange 的驼峰式名称和其他类型的未修改名称。以下是诀窍:
public class OverrideContractResolver : ContractResolverDecorator
{
readonly Dictionary<Type, IContractResolver> overrides;
public OverrideContractResolver(IEnumerable<KeyValuePair<Type, IContractResolver>> overrides, IContractResolver baseResolver)
: base(baseResolver)
{
if (overrides == null)
throw new ArgumentNullException();
this.overrides = overrides.ToDictionary(p => p.Key, p => p.Value);
}
public override JsonContract ResolveContract(Type type)
{
IContractResolver resolver;
if (overrides.TryGetValue(type, out resolver))
return resolver.ResolveContract(type);
return base.ResolveContract(type);
}
}
public class ContractResolverDecorator : IContractResolver
{
readonly IContractResolver baseResolver;
public ContractResolverDecorator(IContractResolver baseResolver)
{
if (baseResolver == null)
throw new ArgumentNullException();
this.baseResolver = baseResolver;
}
#region IContractResolver Members
public virtual JsonContract ResolveContract(Type type)
{
return baseResolver.ResolveContract(type);
}
#endregion
}
然后按如下设置进行序列化:
var settings = new JsonSerializerSettings
{
ContractResolver =
new OverrideContractResolver(
new Dictionary<Type, IContractResolver> { { typeof(CaseToChange), new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver() } },
new Newtonsoft.Json.Serialization.DefaultContractResolver()),
};
生成的 JSON 将如下所示:
{
"stringProperty": "string property",
"otherTypeProperty": {
"FooProperty": "foo",
"BarProperty": 101
}
}
示例fiddle。
为了获得最佳性能,您可能需要cache instances of the contract resolver。