2012-07-04 12 views
33

Próbuję serializować niektóre starsze obiekty, które "leniwy tworzy" różne listy. Nie mogę zmienić zachowania starszego typu.Czy NewtonSoft Json.NET może pominąć szeregowanie pustych list?

I gotuje go w tym prostym przykładzie:

public class Junk 
{ 
    protected int _id; 

    [JsonProperty(PropertyName = "Identity")] 
    public int ID 
    { 
     get 
     { 
      return _id; 
     } 

     set 
     { 
      _id = value; 
     } 
    } 

    protected List<int> _numbers; 
    public List<int> Numbers 
    { 
     get 
     { 
      if(null == _numbers) 
      { 
       _numbers = new List<int>(); 
      } 

      return _numbers; 
     } 

     set 
     { 
      _numbers = value; 
     } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Junk j = new Junk() { ID = 123 }; 

     string newtonSoftJson = JsonConvert.SerializeObject(j, Newtonsoft.Json.Formatting.Indented); 

     Console.WriteLine(newtonSoftJson); 

    } 
} 

obecne wyniki są następujące: { "Identyczność": 123, "Numery" [] }

bym otrzymasz: { "Tożsamość": 123 }

To znaczy, chciałbym pominąć wszystkie listy, collec tions, arrays lub takie rzeczy, które są puste.

Odpowiedz

49

Jeśli nie znalazłeś na to rozwiązania, the answer jest niezwykle prosty, gdy uda Ci się go wyśledzić.

Jeśli masz możliwość rozszerzenia oryginalnej klasy, dodaj do niej funkcję ShouldSerializePropertyName. Powinno to zwrócić wartość typu Boolean wskazującą, czy ta właściwość powinna zostać przekształcona do postaci szeregowej dla bieżącej instancji klasy. W przykładzie może to wyglądać tak (nie testowane, ale należy się obraz):

public bool ShouldSerializeNumbers() 
{ 
    return _numbers.Count > 0; 
} 

To podejście działa dla mnie (choć w VB.NET). Jeśli nie masz uprawnień do modyfikowania oryginalnej klasy, najlepszym rozwiązaniem będzie podejście opisane na stronie z linkami pod adresem IContractResolver.

+12

Możesz uprościć to do 'return (_numbers.Count> 0);' –

+2

Podoba mi się! Niezłe. –

+3

mogę zrobić w sposób ogólny? Nie znam wszystkich nazw właściwości, ale chcę, aby wszystkie puste tablice miały wartość zerową. – Rohit

1

Wystarczy być pendantic commonorgarden, ja strukturze if badanie było:

public bool ShouldSerializecommunicationmethods() 
{ 
    if (communicationmethods != null && communicationmethods.communicationmethod != null && communicationmethods.communicationmethod.Count > 0) 
     return true; 
    else 
     return false; 
} 

Jako pustej listy często będzie zerowy zbyt. Dziękujemy za opublikowanie rozwiązania. ATB.

+3

Inną dostępną opcją jest użycie atrybutu "NullValueHandling": [JsonProperty ("yourPropertyName", NullValueHandling = NullValueHandling.Ignore)]. To powinno pomóc w zmniejszeniu potrzeby kontroli zerowych, które będą udoskonalić twoje, jeśli sprawdzisz trochę. Pomyślałem, że wspomnę o tym, bo może ci się przydać. –

+0

W metodzie ShouldSerialize nadal musisz sprawdzić wartości zerowe, w przeciwnym razie wywołanie funkcji ShouldSerialize spowoduje zgłoszenie wyjątku w przypadku wartości null. Nawet jeśli koder serializacyjny jest zakodowany, aby ignorować wyjątki podczas sprawdzania metod ShouldSerialize, podniesiony w ogóle wyjątek spowoduje niepotrzebne obciążenie, które może wpłynąć na wydajność. Więc potencjalnie zyskujesz o wiele więcej niż tracisz, najpierw sprawdzając wartość zerową. –

Powiązane problemy