Question37400800 vb.net complex JSON

VbNet · Console

/Program.vb

Imports System
Imports System.Linq
Imports System.Collections.Generic
Imports System.Xml.Linq
Imports System.Xml

Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Imports Newtonsoft.Json.Converters
Imports Newtonsoft.Json.Serialization


Public Class Success
    Public Property success As Boolean
	<JsonProperty(ItemConverterType := GetType(SingleOrArrayConverter(Of String)))> _	
	Public Property successes As List(Of List(Of String))
End Class

Public Class Record
    Public Property id As Integer
End Class

Public Class Result
	Public Property records As Record()
	Public Property success As Boolean

	<JsonIgnore> _
	Public Property successes as Dictionary(Of string, Success)

	<JsonExtensionData> _
	Private _additionalData as Dictionary(Of string, JToken)

	<System.Runtime.Serialization.OnSerializing> _
	Sub OnSerializing(ByVal context as System.Runtime.Serialization.StreamingContext)
		If successes IsNot Nothing
			_additionalData = successes.ToDictionary(Function(p) p.Key, Function(p) JToken.FromObject(p.Value))
		Else
			_additionalData = Nothing
		End If
	End Sub

	<System.Runtime.Serialization.OnSerialized> _
	Sub OnSerialized(ByVal context as System.Runtime.Serialization.StreamingContext)
		_additionalData = Nothing
	End Sub

	<System.Runtime.Serialization.OnDeserializing> _
	Sub OnDeserializing(ByVal context as System.Runtime.Serialization.StreamingContext)
		_additionalData = Nothing
	End Sub

	<System.Runtime.Serialization.OnDeserialized>
	Sub OnDeserialized(ByVal context as System.Runtime.Serialization.StreamingContext)

		If _additionalData IsNot Nothing
			successes = _additionalData.ToDictionary(Function(p) p.Key, Function(p) p.Value.ToObject(Of Success)())
		End If
		_additionalData = Nothing

	End Sub
End Class


Public Class Response
    Public Property type As String
    Public Property tid As Integer
    Public Property action As String
    Public Property method As String
    Public Property result As Result
End Class


Public Class SingleOrArrayConverter(Of T)
    Inherits JsonConverter

	Public Overrides ReadOnly Property CanWrite() As Boolean
		Get
			Return false
		End Get
	End Property

    Public Overrides Sub WriteJson(writer As JsonWriter, value As Object, serializer As JsonSerializer)
        Throw New NotImplementedException()
    End Sub

    Public Overrides Function ReadJson(reader As JsonReader, objectType As Type, existingValue As Object, serializer As JsonSerializer) As Object
		Dim retVal As Object = New List(Of T)()
        If reader.TokenType = JsonToken.StartArray Then
			serializer.Populate(reader, retVal)
        Else
            Dim instance As T = DirectCast(serializer.Deserialize(reader, GetType(T)), T)
			retVal.Add(instance)
        End If
        Return retVal
    End Function

    Public Overrides Function CanConvert(objectType As Type) As Boolean
		Return objectType = GetType(List(Of T))
    End Function

End Class

				
Public Module Module1

	Public Sub Main()
		Dim Jstring As String = <![CDATA[[
  {
    "type": "rpc",
    "tid": 18,
    "action": "TaskSystem",
    "method": "createTask",
    "result": {
      "0": {
        "success": true,
        "successes": [
          [
            "Task successfuly created with S/N #22920"
          ]
        ]
      },
      "1": {
        "success": true,
        "successes": [
          [
            "Task successfuly created with S/N #22921"
          ],
          "Task #22921 marked as urgent"
        ]
      },
      "records": [
        {
          "id": 22920
        },
        {
          "id": 22921
        }
      ],
      "success": true
    }
  }
]
]]>.Value

		Console.WriteLine("Original JSON: ")
		Console.WriteLine(Jstring) 
		Console.WriteLine("")

		Dim Jobj = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Response())(Jstring)

		Dim newJString = Newtonsoft.Json.JsonConvert.SerializeObject(JObj, Newtonsoft.Json.Formatting.Indented)

		Console.WriteLine("Re-serialized JSON: ")
		Console.WriteLine(newJString)
		Console.WriteLine("")

	End Sub
End Module
;