3

私は再帰的なデータ構造を持っています。何かのようなもの...

Public Class Comparison
    Property Id As Integer
End Class

Public Class SimpleComparison
    Inherits Comparison
    Property Left As String
    Property Right As String
End Class

Public Class ComplexComparison
    Inherits Comparison
    Property Left As Comparison
    Property Right As Comparison
End Class

JSONからこれに逆シリアル化する必要があります。

ご覧のとおり、a と a のどちらを使用するかを決定する唯一の方法ComplexComparisonSimpleComparison.Left値が文字列かオブジェクトかを決定することです。(注: どちらも文字列または両方のオブジェクトになります)

だから、私はカスタムコンバーターを書いていて、ここまで来ました...

Public Class ComparisonConverter
    Inherits Newtonsoft.Json.JsonConverter
    ''<Snip>
Public Overrides Function ReadJson(reader As Newtonsoft.Json.JsonReader, objectType As Type, existingValue As Object, serializer As Newtonsoft.Json.JsonSerializer) As Object
    Dim obj As JObject = TryCast(serializer.Deserialize(Of JToken)(reader), JObject)
    If obj IsNot Nothing Then
            ''We''ve got something to work with
        Dim Id As Integer = obj("Id").ToObject(Of Integer)()

            ''Check if we''re instantiating a simple or a complex comparison
        If obj("Left").GetType.IsAssignableFrom(GetType(JValue)) Then
            ''LHS is a string - Simple...
            Return New SimpleComparison With {
                .Id = Id,
                .Left = obj("Left").ToObject(Of String)(),
                .Right = obj("Right").ToObject(Of String)()}
        Else
            Return New ComplexComparison With {
            .Id = Id,
            .Left = ???, '' <<Problem
            .Right = ???}'' <<Problem
        End If
    Else
        Return Nothing
    End If
End Function
End Class

Ifオブジェクトが複雑であることに起因するの分岐は、私が行き詰まるところです。obj("Left")and obj("Right")(タイプは ) でデシリアライザーを再度呼び出すにはどうすればよいJTokenですか? または、それらをキャストしてからJObject、このコードを別の関数に分解し、それを再帰的に呼び出す必要がありますか?

4

1 に答える 1

2

思ったよりも簡単で、JSON.Net が面倒な作業をすべてやってくれます...

Public Overrides Function ReadJson(reader As Newtonsoft.Json.JsonReader, objectType As Type, existingValue As Object, serializer As Newtonsoft.Json.JsonSerializer) As Object
    Dim Ret As Comparison
    Dim JComparison As JObject = JObject.Load(reader)
    If JComparison("Left").GetType.IsAssignableFrom(GetType(JValue)) Then
        Ret = New SimpleComparison
    Else
        Ret = New ComplexComparison
    End If
    serializer.Populate(JComparison.CreateReader(), Ret)
    Return Ret
End Function
于 2012-10-23T09:33:42.953 に答える