2017-02-07 179 views
0

私のクラスプロパティのラクダケーシングには以下の設定を使用しています。プロパティ名の大文字/小文字を変更するJsonSerializerSettings

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を追加するために、あなたのタイプを変更することができた場合は、一番簡単な方法は、あなたのCaseToChangeタイプに[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]を追加することです:

[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のバージョンを使用している場合9.0.1より前の.NETの場合、this answerのように各プロパティに[JsonProperty("camelCaseName")]を追加してください。

タイプを変更できない場合は、CaseToChangeのプロパティをシリアライザsett CaseToChangeのキャメルケース名と他のタイプの変更されていない名前を返すcustom contract resolverを作成することができます。その後

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属性を追加し、オブジェクトツリー全体に対してcamelCasingを使用しない場合は、CamelCasePropertyNamesContractResolverを使用しないでください。

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" 
} 
関連する問題