4

いくつかの条件に基づいて、いくつかのオブジェクトがシリアル化されないようにする方法を見つけようとしています。私が見つけることができるのは、ShouldSerialize* メソッドを使用してオブジェクトのプロパティを無視する方法だけですが、オブジェクト全体を無視する方法はわかりません。

これが私の状況を説明する例です。会社は複数の従業員を持つことができ、従業員は現在または非現在のいずれかです。

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にシリアル化されるのを無視/除外できるようにしたいと考えています。

今考えられる唯一の方法は、現在の従業員と非現在の従業員を 2 つのプロパティに分けて、非現在の従業員に を使用できるようにすること<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

ただし、実際の状況にはこれらのものがいくつかあるため、これを回避しようとしているため、すべてのリストを2つに分割して大規模なコード変更が必要になることは望ましくありません. jsonのシリアライズ側だけでできればいいのですが。

どんな助けでも感謝します。ありがとう!

4

2 に答える 2

0

Json.NET には、必要なものを実現できる機能が組み込まれていないようです。最終的に、Company クラス内に、不要なデータを "クリーンアップ" してから 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

ここで行う必要があるのは、Company オブジェクトをシリアル化しようとするときはいつでも、代わりに GetObjectToSerialize() 関数を呼び出して、返されたオブジェクトをシリアル化することだけです。

Dim objToSave As Company = companyObj.GetObjectToSerialize()
Dim json As String = JsonConvert.SerializeObject(objToSave, Formatting.Indented)
于 2013-12-18T23:17:40.300 に答える