2013-05-17 3 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. Я бы сказал, что исходный вопрос был введен в заблуждение –

1

Json.Net поддерживает условную сериализацию. Проверьте ссылку ниже для реализации

http://james.newtonking.com/projects/json/help/html/ConditionalProperties.htm

+0

Я видел это, но это не совсем то, что я хочу, поскольку это позволяет мне игнорировать всю собственность, если условие выполнено. Мне нужно иметь возможность всегда включать свойство, но не все элементы внутри него. –

Смежные вопросы