我正在使用JSON.NET对来自HTTP查询的JSON响应进行反序列化,但是反序列化方面存在问题。
源JSON是这样的:
[
{
"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
}
}
]
我一直在使用这些类进行反序列化:
Private Sub Deserialize()
Dim Jobj = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Response())(Jstring)
End Sub
Public Class Record
Public Property id As Integer
End Class
Public Class Result
Public Property records As Record()
Public Property success As Boolean
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
但是然后我丢失了查询返回的成功/失败消息
我应该如何写类结果以colect性能记录作为记录() ,更迭为布尔和也的那些对象为“0”,“1”,等等...?
非常感谢您的帮助。
您在这里有两个不相关的问题:
您的Result
类由一组固定属性和一组变量属性组成,这些变量属性具有递增的数字名称和值的标准化模式。您想自动反序列化标准属性,以及捕获和反序列化自定义属性。
可以使用来完成JsonExtensionData
。使用此属性,您可以暂时将自定义属性反序列化为a,Dictionary(of String, JToken)
然后Dictionary(Of String, Success)
在[OnDeserialized]
回调中转换为a 。这Success
是一种旨在捕获JSON的类型,如下所示:
{
"success": true,
"successes": [ [ "Task successfuly created with S/N #22920" ] ]
}
有关文档,请参见反序列化ExtensionData。
在上述Success
类型的内部,"successes"
数组既包含字符串数组,又包含单个字符串。
如果您successes
按以下方式定义属性:
Public Property successes As List(Of List(Of String))
然后这可以使用的变化来处理SingleOrArrayConverter(Of String)
从如何处理这两种单个项目和用于使用JSON.net相同的属性的阵列,其设置为项转换器通过<JsonProperty(ItemConverterType := GetType(SingleOrArrayConverter(Of String)))>
。
因此,您的最终课程将如下所示:
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
原型小提琴。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句