2017-02-07 6 views
0

Я использую ниже настройки для верблюжьего корпуса моего класса.JsonSerializerЗамены, чтобы изменить регистр имени собственности, но не имя собственности собственности

JsonSerializerSettings settings = new JsonSerializerSettings() 
     { 
      ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver() 
     }; 

Некоторые из свойств объекта имеют некоторые другие типы классов. Я не хочу менять случай этих свойств.

Например:

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" 

} 

Как добиться этого с JsonSerializerSettings?

+0

'JsonSerializerSettings' применяет настройки по умолчанию для всех типов, которые сериализуются. Если вы просто хотите изменить оболочку «CaseToChange» на случай верблюда, вы можете применить ['[JsonObject (NamingStrategyType = typeof (CamelCaseNamingStrategy))]] (http://www.newtonsoft.com/json/help/html /P_Newtonsoft_Json_JsonContainerAttribute_NamingStrategyType.htm). – dbc

+0

Нужно ли вам ** это быть в настройках или вы можете изменить тип? – dbc

ответ

1

Если вы можете изменить свои типы добавить 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.

1

Просто добавьте атрибут JsonProperty, как показано ниже, и не используйте CamelCasePropertyNamesContractResolver, если вы не хотите, чтобы camelCasing для всего дерева объектов.

public class CaseToChange 
{ 
    [JsonProperty("stringProperty")] 
    public string StringProperty { get; set; } //Change to camelCase 

    [JsonProperty("otherTypeProperty")] 
    public SomeOtherType OtherTypeProperty { get; set; } //Change name of this to camelCase but not property name of "SomeOtherType" 
} 
Смежные вопросы