2013-05-17 56 views
4

我一直在试图找出一种方法来忽略某些对象被基于某些条件序列化。我所能找到的就是如何使用ShouldSerialize *方法忽略对象的属性,而不是如何忽略整个对象。JSON.NET中的条件对象序列化

下面是一个解释我的情况的例子。一个公司可以有多个员工,员工可以是现任的也可以是非现任的。

Public Class Company 
    Public Property Name As String 
    Public Property Employees As List(Of Employee) 
End Class 

Public Class Employee 
    Public Property FirstName As List(Of Name) 
    Public Property LastName As List(Of Name) 
    Public Property Current As Boolean 
End Class 

我希望能够忽略/排除非当前雇员被序列化为json。

我现在能想到的唯一方法是将当前和非现任员工分为两个属性,以便我可以使用<JsonIgnoreAttribute()>作为非当前员工。

如:

Public Class Company 
    Public Property Name As String 
    Public Property CurrentEmployees As List(Of Employee) 
    <JsonIgnoreAttribute()> 
    Public Property PastEmployees As List(Of Employee) 
End Class 

Public Class Employee 
    Public Property FirstName As List(Of Name) 
    Public Property LastName As List(Of Name) 
    Public Property Current As Boolean 
End Class 

但是我想避免这种情况,因为我有很多的这些东西在我的真实情况,所以我不希望所有的名单分成两个,这将需要广泛的代码修改。如果可以在json序列化方面完成,那将会很好。

任何帮助表示赞赏。谢谢!

回答

0

有似乎没有在Json.NET的功能,可以让我实现需要什么建。我最终在公司类中添加了一个函数,在序列化成json之前“清除”不需要的数据。

使用前面的例子:

Public Class Company 
    Public Property Name As String 
    Public Property Employees As List(Of Employee) 

    ' Before serializing, call this function 
    Public Function GetObjectToSerialize() As Company 

     ' Clone the object 
     Dim cleanObj As Company = CType(Me.MemberwiseClone, Company) 

     If Me.Employees.Count > 0 Then 
      cleanObj.Employees = New List(Of Employee) 
      For Each empl As Employee In Me.Employees 
       ' only include the current employees 
       If Not empl.Current Then 
        cleanObj.Employees.Add(empl) 
       End If 
      Next 
     End If 
    End Function 
End Class 

Public Class Employee 
    Public Property FirstName As List(Of Name) 
    Public Property LastName As List(Of Name) 
    Public Property Current As Boolean 
End Class 

所有我现在要做的是,每当我即将序列化对象的公司,我叫GetObjectToSerialize()函数和序列化返回的对象来代替。

Dim objToSave As Company = companyObj.GetObjectToSerialize() 
Dim json As String = JsonConvert.SerializeObject(objToSave, Formatting.Indented) 
+0

这不是“有条件的序列化”,这是有选择地克隆一个对象的成员,然后序列化整个克隆。您可以使用LINQ轻松完成此操作。我会说原来的问题是误导性的 –