2015-09-15 15 views
5

Czy istnieje sposób, aby programowo włączyć/wyłączyć użycie nazwy właściwości określonej przez [JsonProperty]?Włącz/wyłącz użycie określonej [JsonProperty] nazwy

Kiedy serializacji:

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

Chciałbym móc zobaczyć wyjście "w debug":

{ 
    "LooooooooooooongName":"Data" 
} 

A "w wydaniu":

{ 
    "l":"Data" 
} 
+0

Masz na myśli cały program, na każdej lekcji jednocześnie? – tia

+0

Tak, mam kilka dziesiątek DTO –

Odpowiedz

3

Wystarczy utworzyć przelicznik, aby obsłużyć zlecenie.

public class NoJsonPropertyNameContractResolver : DefaultContractResolver 
{ 

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

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

i gdzieś w kodzie startowym

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

Masz teraz niespójne zachowanie między swoim debugowania i kompilacji Release (ale dlaczego?).

+1

Dzięki, Powodem jest po prostu to, że chcę się upewnić, że wynik jest tak mały, jak to możliwe (a krótkie nazwy właściwości powodują znaczną różnicę w długości wyjściowej). Będąc w fazie rozwoju chciałbym skorzystać z pełnych nazw dla czytelności. –

2

Możesz spróbować użyć C# preprocessor directives:

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

EDIT

Ок, może nie jest to bardzo wygodne, jeśli trzeba to zrobić po całej aplikacji. Innym wygodniejszym rozwiązaniem może być implementacja niestandardowego ContractResolver i umieszczenie tej dyrektywy preprocesora tylko w jednym miejscu.

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

A Zastosowanie:

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

Uwaga: można wdrożyć otoki wokół ustawień JsonConverter lub wykorzystanie domyślny json serializer, więc przyzwyczajenie trzeba określić rezolwer o zamówieniu za każdym razem.

+0

Prawda, ale ból w dupie –

+0

@VojtechB zaktualizował odpowiedź –

+0

Dzięki za odpowiedź, ale @ tia zaoferowała to rozwiązanie jako pierwsze. BTW Jego rozwiązanie jest również lepsze, biorąc pod uwagę, że zmienia zachowanie tylko w trybie DEBUG. –