2012-07-04 3 views
33

J'essaie de sérialiser certains objets hérités que "paresseux crée" différentes listes. Je ne peux pas changer le comportement hérité.Newtonsoft Json.NET peut-il ignorer la sérialisation des listes vides?

Je l'ai bouilli jusqu'à cet exemple simple:

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

    } 
} 

Les résultats actuels sont les suivants: { "Identité": 123, "Numéros": [] }

Je voudrais comme pour obtenir: { "identité": 123}

C'est, je voudrais sauter toutes les listes, collec tions, tableaux, ou des choses qui sont vides.

Répondre

49

Si vous n'avez pas trouvé de solution, the answer est remarquablement simple lorsque vous parvenez à le retrouver.

Si vous êtes autorisé à étendre la classe d'origine, ajoutez-y une fonction ShouldSerializePropertyName. Cela devrait renvoyer un booléen indiquant si cette propriété doit ou non être sérialisée pour l'instance actuelle de la classe. Dans votre exemple, cela pourrait ressembler à ceci (non testé, mais vous devriez obtenir l'image):

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

Cette approche fonctionne pour moi (bien que dans VB.NET). Si vous n'êtes pas autorisé à modifier la classe d'origine, l'approche IContractResolver décrite sur la page liée est la voie à suivre.

+12

Vous pouvez simplifier cela à 'return (_numbers.Count> 0);' –

+2

J'aime ça! Joli. –

+3

puis-je faire d'une manière générique? Je ne connais pas tous les noms de propriété, mais je veux que tous les tableaux vides soient null. – Rohit

1

Juste pour être pendantic commonorgarden, j'ai structuré le cas test soit:

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

Comme une liste vide sera souvent nul aussi. Merci d'avoir posté la solution. ATB.

+3

Une autre option que vous avez est d'utiliser l'attribut "NullValueHandling": [JsonProperty ("yourPropertyName", NullValueHandling = NullValueHandling.Ignore)]. Cela devrait aider à réduire le besoin des vérifications nuls qui raffineront vos vérifications si un peu. Je pensais juste que je le mentionnerais comme vous le trouverez peut-être utile. –

+0

Dans la méthode ShouldSerialize, vous devez toujours rechercher des valeurs NULL, sinon un appel à ShouldSerialize lèvera une exception sur les valeurs NULL. Même si le sérialiseur est codé pour ignorer les exceptions lors de la vérification des méthodes ShouldSerialize, l'exception soulevée ajoutera une surcharge inutile qui pourrait affecter les performances. Donc, vous gagnez potentiellement beaucoup plus que ce que vous perdez en vérifiant d'abord null. –

Questions connexes