2012-07-04 79 views
33

我想序列化一些遺留的對象,「懶創建」各種列表。我無法改變傳統行爲。Newtonsoft Json.NET可以跳過序列化空列表嗎?

我已煮沸它到這個簡單的例子:

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

    } 
} 

目前的結果是: { 「同一性」:123, 「數字」:[] }

我會喜歡得到: { 「身份」:123 }

也就是說,我想跳過任何列表,collec tions,數組或空的東西。

回答

49

如果你沒有找到解決方案,the answer是非常簡單的,當你設法追蹤它。

如果您被允許擴展原始類,然後添加一個ShouldSerializePropertyName函數。這應該返回一個布爾值,指示是否應爲該類的當前實例序列化該屬性。在您的例子,這可能是這樣的(未測試,但你應該得到的圖片):

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

這個方法對我的作品(儘管在VB.NET)。如果你不允許修改原來的課程,那麼在鏈接頁面上描述的方法是可行的。

+12

你可以簡化爲'return(_numbers.Count> 0);' –

+2

我喜歡它!好一個。 –

+3

我可以用通用的方法嗎?我不知道所有的屬性名稱,但希望所有空數組爲空。 – Rohit

1

只要是pendantic commonorgarden,我構造的試驗是否是:

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

爲空列表往往會空了。感謝您發佈解決方案。 ATB。

+3

您擁有的另一個選擇是使用「NullValueHandling」屬性:[JsonProperty(「yourPropertyName」,NullValueHandling = NullValueHandling.Ignore)]。這應該有助於減少對空檢查的需求,這將對您的檢查進行一些改進。只是覺得我會提到它,因爲你可能會發現它很方便。 –

+0

在ShouldSerialize方法中,您仍然需要檢查空值,否則調用ShouldSerialize將在空值上拋出異常。即使在檢查ShouldSerialize方法時序列化程序被編碼爲忽略異常,所有引發的異常都會增加可能影響性能的不必要開銷。因此,您可能首先檢查空值,從而獲得更多的收益。 –