2015-09-15 13 views
5

[JsonProperty]で指定されたプロパティ名の使用をプログラムで有効/無効にする方法はありますか?指定された[JsonProperty]名の使用を有効/無効にする

私はシリアライズ:

public class Dto 
{ 
    [JsonProperty("l")] 
    public string LooooooooooooongName { get; set; } 
} 

私は "デバッグ中に" 出力を見ることができるようにしたいと思います:

"リリースの"
{ 
    "LooooooooooooongName":"Data" 
} 

そして:

{ 
    "l":"Data" 
} 
+0

あなたは、すべてのクラスで一度にあなたのプログラム全体を意味しますか? – tia

+0

はい、私は数十のDTOを持っています –

答えて

3

ジョブを処理するリゾルバを作成するだけです。

public class NoJsonPropertyNameContractResolver : DefaultContractResolver 
{ 

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 

     JsonProperty property = base.CreateProperty(member, memberSerialization); 
     property.PropertyName = property.UnderlyingName; 
     return property; 
    } 
} 

とどこかにあなたの起動コードで

#if DEBUG 
JsonConvert.DefaultSettings =() => new JsonSerializerSettings() 
     { 
       ContractResolver = new NoJsonPropertyNameContractResolver() 
     }; 
#endif 

今、あなたのデバッグの間で一貫性のない動作を持っているし、ビルド(なぜ?)をリリース。

+1

ありがとう、理由は、私は出力ができるだけ小さいことを確認したい(と短いプロパティ名は出力の長さに大きな違いを確認する)です。開発中は読みやすさの完全な名前の恩恵を受けたいと思います。 –

2

C# preprocessor directives

をご利用くださいあなたは、アプリケーション全体の周りにそれをしなければならない場合
public class Dto 
{ 
#if !DEBUG 
    [JsonProperty("l")] 
#endif  
    public string LooooooooooooongName { get; set; } 
} 

ОкEDITは、多分これは非常に便利ではありません。もう1つのより便利な方法は、カスタムContractResolverを実装し、このプリプロセッサディレクティブを1か所に配置することです。

public class CustomContractResolver : DefaultContractResolver 
{ 
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     var prop = base.CreateProperty(member, memberSerialization); 

#if DEBUG 
     if(prop != null) 
     { 
      // If in debug mode -> return PropertyName value to the initial member name. 
      prop.PropertyName = member.Name; 
     } 
#endif 

     return prop; 
    } 
} 

と使用方法:

var jsonString = JsonConvert.SerializeObject(someObj, new JsonSerializerSettings 
{ 
    ContractResolver = new CustomContractResolver(), 
}); 

:あなたはJsonConverter周りのラッパーを実装するか、デフォルトのJSONシリアライザの設定を使用するので、あなたは文句を言わない契約リゾルバを毎回指定する必要がありますすることができます。

+0

真ですが、お尻の痛み –

+0

@VojtechBは答えを –

+0

返信ありがとう@tiaこのソリューションを最初に提供しました。 BTW彼の解決策は、DEBUGモードでの動作のみを変更することを考慮すると、より優れています。 –

関連する問題