私は再帰的なデータ構造を持っています。何かのようなもの...
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 のどちらを使用するかを決定する唯一の方法ComplexComparison
はSimpleComparison
、.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
、このコードを別の関数に分解し、それを再帰的に呼び出す必要がありますか?