VbNet · Console
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