2016-12-17 6 views
2

ExpandoObject内のすべてのプロパティをPascalCaseプロパティ名に変換する目的で、Newtonsoft.Json.SerializationでDefaultContractResolverを拡張するカスタムコントラクトリゾルバを作成しようとしています。DefaultContractResolverを拡張してExpandoObjectサブプロパティをPascalCaseに変換する

私の契約:

public class Fruit 
{ 
    public int Id { get; set; } 
    public ExpandoObject FruitProperties { get; set; } 
} 

私は、次のデータを渡しています:

{ 
    "Id": "1234", 
    "FruitProperties" : { 
     "colour": "red", 
     "Taste": "sweet 
    } 

    } 

} 

私は期待していた結果は以下の通りです:

{ 
    "Id": "1234", 
    "FruitProperties" : { 
     "Colour": "red", 
     "Taste": "sweet" 
    } 
} 

私はResolvePropertyNameをオーバーライドしようとしています、およびDefaultContractResolverのCreatePropertyメソッドを使用できます。これらのすべては、expandoオブジェクト内のサブプロパティをスキップします。誰かが私がPascalCaseにExpandoのサブプロパティ名を変換するために上書きする必要があるDefaultContractResolverのどのメソッドを知っていますか?

答えて

1

ExpandoObjectはリフレクションによってシリアル化されないため、CreatePropertyの変更は機能しません。むしろ、IDictionary<string, object>としてシリアル化されています。したがって、Json.NET 9.0.1の新しいNamingStrategyタイプを利用して、PascalCase のカスタムネーミング戦略を作成して、の辞書キーのみを使用することができます。その後

public class PascalCaseDictionaryKeyNamingStrategy : DefaultNamingStrategy 
{ 
    public PascalCaseDictionaryKeyNamingStrategy() : base() { this.ProcessDictionaryKeys = true; } 

    public override string GetDictionaryKey(string key) 
    { 
     if (ProcessDictionaryKeys && !string.IsNullOrEmpty(key)) 
     { 
      if (char.ToUpperInvariant(key[0]) != key[0]) 
      { 
       var builder = new StringBuilder(key); 
       builder[0] = char.ToUpperInvariant(key[0]); 
       return builder.ToString(); 
      } 
     } 
     return key; 
    } 
} 

DefaultContractResolver.NamingStrategyにそれを設定する(または任意のcustom subclass of DefaultContractResolverにご希望の場合):

var resolver = new DefaultContractResolver { NamingStrategy = new PascalCaseDictionaryKeyNamingStrategy() }; 
var json = JsonConvert.SerializeObject(fruit, Formatting.Indented, new JsonSerializerSettings { ContractResolver = resolver }); 

Console.WriteLine(json); 
NamingStrategytrueに設定すると、Json.NETは辞書のキー名をマップする原因となる性質 NamingStrategy.ProcessDictionaryKeysを持っています

出力:

{ 
    "Id": 1234, 
    "FruitProperties": { 
    "Colour": "red", 
    "Taste": "sweet" 
    } 
} 
関連する問題