Если вы можете изменить свои типы добавить 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"
}
(Или, если вы используете версию Json .NET раньше, чем 9.0.1, добавить [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.
'JsonSerializerSettings' применяет настройки по умолчанию для всех типов, которые сериализуются. Если вы просто хотите изменить оболочку «CaseToChange» на случай верблюда, вы можете применить ['[JsonObject (NamingStrategyType = typeof (CamelCaseNamingStrategy))]] (http://www.newtonsoft.com/json/help/html /P_Newtonsoft_Json_JsonContainerAttribute_NamingStrategyType.htm). – dbc
Нужно ли вам ** это быть в настройках или вы можете изменить тип? – dbc