StackOverflow Q28395700 (vb)

VbNet · Console

/Program.vb

Imports System
Imports System.Collections.Generic
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
				
Public Module Module1
	Public Sub Main()
		
        Dim json As String = "{""Make"":""Dodge"",""Model"":""Charger"",""Lines"": [{""line"":""base"",""engine"": ""v6"",""color"":""red""},{""line"":""R/T"",""engine"":""v8"",""color"":""black""}],""Year"":""2013""}"
        Dim json2 As String = "{""Make"":""Dodge"",""Model"":""Charger"",""Lines"": {""line"":""R/T"",""engine"":""v8"",""color"":""black""},""Year"":""2013""}"

        Console.WriteLine("--- Array ---")
        DeserializeAndDump(json)

        Console.WriteLine()
        Console.WriteLine("--- Single ---")
        DeserializeAndDump(json2)
		
	End Sub
	
    Sub DeserializeAndDump(json As String)

        Dim car As jsonCar = JsonConvert.DeserializeObject(Of jsonCar)(json)

        Console.WriteLine("Make: " & car.make)
        Console.WriteLine("Model: " & car.model)
        Console.WriteLine("Year: " & car.year)
        Console.WriteLine("Lines: ")
		
		For Each ln As jsonCarLines In car.lines
            Console.WriteLine("    Name: " & ln.line)
            Console.WriteLine("    Engine: " & ln.engine)
            Console.WriteLine("    Color: " & ln.color)
            Console.WriteLine()
        Next

    End Sub

    Public Class jsonCar
        Public Property make As String
        Public Property model As String
        <JsonConverter(GetType(SingleOrArrayConverter(Of jsonCarLines)))>
        Public Property lines As List(Of jsonCarLines)
        Public Property year As String
    End Class

    Public Class jsonCarLines
        Public Property line As String
        Public Property engine As String
        Public Property color As String
	End Class
						
	Public Class SingleOrArrayConverter(Of T)
    	Inherits JsonConverter

		Public Overrides Function CanConvert(objectType As Type) As Boolean
			Return objectType = GetType(List(Of T))
		End Function
	
		Public Overrides Function ReadJson(reader As JsonReader, objectType As Type, existingValue As Object, serializer As JsonSerializer) As Object
			Dim token As JToken = JToken.Load(reader)
	
			If (token.Type = JTokenType.Array) Then
				Return token.ToObject(Of List(Of T))()
			End If
	
			Return New List(Of T) From {token.ToObject(Of T)()}
		End Function
	
		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
	
	End Class

End Module

;