2015-09-15 4 views
5

Esiste un modo per abilitare/disabilitare a livello di programmazione l'utilizzo del nome della proprietà specificato da [JsonProperty]?Abilita/disabilita l'utilizzo del nome [JsonProperty] specificato

Quando ho serializzare:

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

Vorrei essere in grado di vedere un output "in debug":

{ 
    "LooooooooooooongName":"Data" 
} 

E "in versione":

{ 
    "l":"Data" 
} 
+0

Intendi per l'intero programma, in tutte le classi contemporaneamente? – tia

+0

Sì, ho diverse decine di DTO –

risposta

3

Basta creare un resolver per gestire il lavoro.

public class NoJsonPropertyNameContractResolver : DefaultContractResolver 
{ 

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

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

e da qualche parte nel codice di avvio

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

È ora hanno un comportamento incoerente tra il Debug e Release build (ma perché?).

+1

Grazie, Il motivo è semplicemente che voglio assicurarmi che l'output sia il più piccolo possibile (e nomi di proprietà brevi fanno una differenza significativa nella lunghezza dell'output). Durante lo sviluppo, vorrei beneficiare dei nomi completi per la leggibilità. –

2

Puoi provare a utilizzare C# preprocessor directives:

public class Dto 
{ 
#if !DEBUG 
    [JsonProperty("l")] 
#endif  
    public string LooooooooooooongName { get; set; } 
} 

EDIT

Ок, forse questo non è molto conveniente se si deve fare in giro l'intera applicazione. Un altro approccio più conveniente potrebbe essere quello di implementare l'ContractResolver personalizzato e posizionare questa direttiva per il preprocessore in un unico punto.

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; 
    } 
} 

E l'utilizzo:

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

Nota: è possibile implementare wrapper impostazioni JsonConverter o serializzatore JSON uso di default, in modo da non necessario specificare il risolutore del contratto ogni volta.

+0

Vero, ma il dolore nel culo –

+0

@VojtechB ha aggiornato la risposta –

+0

Grazie per la risposta, ma @tia ha offerto prima questa soluzione. BTW La sua soluzione è anche migliore considerando che cambia il comportamento solo in modalità DEBUG. –