2016-09-21 49 views
6

Blueprint dla struktury danych:Dodaj Wielokrotna umowa Resolver w Newtonsoft.Json

public class Movie 
{ 
    public string Name { get; set; } 
} 

Korzystanie Newtonsoft.Json, mam następującą konfigurację Json serializacji.

var settings = new JsonSerializerSettings() { 
    ContractResolver = new CamelCasePropertyNamesContractResolver(), 
}; 

Oczywiście, że będzie to wydrukować:

{ 
    name: null 
} 

Teraz muszę dodać kolejny NullToEmptyStringResolver do ContractResolver w JsonSerializerSettings, w jaki sposób można osiągnąć to, co wyjście jak poniżej:

{ 
    name: "" 
} 
  • Proszę zauważyć, że mój NullToEmptyStringResolver jest już napisany. Ale muszę dodać zarówno NullToEmptyStringResolver i CamelCasePropertyNamesContractResolver do Resolver umowy.
+2

Proszę nie niszczyć swojego posta. – Rizier123

Odpowiedz

6

Json.Net nie zezwala na więcej niż jeden rozstrzygający kontrakt na raz, więc będziesz potrzebował sposobu na połączenie swoich zachowań. Zakładam, że NullToEmptyStringResolver jest niestandardowym przelicznikiem, który dziedziczy z klasy Json.Net o nazwie DefaultContractResolver. Jeśli tak, jednym z prostych sposobów osiągnięcia pożądanego rezultatu jest zastąpienie NullToEmptyStringResolver dziedziczeniem z CamelCasePropertyNamesContractResolver.

public class NullToEmptyStringResolver : CamelCasePropertyNamesContractResolver 
{ 
    ... 
} 

Jeśli nie podoba takie podejście, innym pomysłem jest dodanie zachowania obudowy wielbłądzie do NullToEmptyStringResolver. Jeśli przyjrzeć się, jak CamelCasePropertyNamesContractResolver jest zaimplementowany w, zobaczysz, że jest to tak proste jak ustawienie NamingStrategy w konstruktorze (zakładając, że używasz Json.Net 9.0.1 lub nowszego). Możesz dodać ten sam kod do konstruktora swojego NullToEmptyStringResolver.

public class NullToEmptyStringResolver : DefaultContractResolver 
{ 
    public NullToEmptyStringResolver() : base() 
    { 
     NamingStrategy = new CamelCaseNamingStrategy 
     { 
      ProcessDictionaryKeys = true, 
      OverrideSpecifiedNames = true 
     }; 
    } 

    ... 
} 
+0

tak, to działa, dziękuję. – shana0721shana

+0

czy możliwe jest zastosowanie tego przelicznika w modelu jako atrybutu? http://stackoverflow.com/questions/43820249/keeping-contract-resolver-in- attribute – user960567