我尝试使用返回JSON消息的web服务。每个方法返回相关的JSON消息(通常是数组)或JSON错误消息(不是数组)。
UserList和Error消息示例:
[
{
"id":1,
"login":"john1",
"full_name":"John Smith"
},
{
"id":2,
"login":"anne",
"full_name":"Anne Steward"
}
]
{
"success":false,
" message":"Unknown login"
}
因为代码不知道期待哪条消息,所以我创建了两个类,其中UserList继承自baserresponse(一个错误消息类)。我使用了继承,因为所有其他方法,如GetCarList等,也适合返回错误消息。因此不需要多次声明错误字段。这必须是聪明的-我将总是获得或UserList字段或错误消息字段在同一个对象。
Public Class BaseResponse
Public success As Boolean
Public message As String
End Class
Public Class UserListResponse
Inherits BaseResponse
Public id As Integer
Public login As String
Public full_name As String
End Class
问题是,UserListResponse JSON消息是一个数组,而ErrorMessage JSON不是一个数组。因此,当JSON为UserList时,反序列化将起作用,但当JSON为错误消息时,反序列化将不起作用:
JsonConvert.DeserializeObject(Of List(Of UserListResponse))(ReceivedJSONMessage)
有什么聪明的方法来解决这个问题吗?
如果你确定你的两个返回类都在正确地反序列化json,你只需要在本质上:"我是一个列表还是一个字符串?"来请求一个路径或另一个路径。
编辑8-30 好吧,所以我错过了你不知道,直到它被执行,我的错。您可以在子例程而不是函数中执行逻辑,然后在检查传递的泛型对象时直接执行逻辑。与此类似
Private Sub DetermineReturn(obj As Object)
If obj.GetType = GetType(String) Then
Console.WriteLine(CType(obj, String))
ElseIf obj.GetType = GetType(List(Of String)) Then
CType(obj, List(Of String)).ForEach(Sub(x) Console.WriteLine(x))
Else
Console.WriteLine("UnKnOwN!1!")
End If
End Sub
Sub Main()
Dim testError = "Oh Shoot Error!"
Dim GoodStuff = New List(Of String)({"I", "am", "a", "list"})
Console.WriteLine("FirstExample")
DetermineReturn(testError)
Console.WriteLine()
Console.WriteLine("SecondExample")
DetermineReturn(GoodStuff)
Console.WriteLine()
Console.WriteLine("ThirdExample")
DetermineReturn(1)
Console.ReadLine()
End Sub
本质上,你只需要直接在方法'DetermineReturn'中转换JSON,而不是Console.WriteLines。我正在解释传入的'obj',使用反射来获得它的类型,然后可以安全地转换为该类型。所以你可以把JSON返回的参数放在方法中比如DetermineReturn((YourJSONResult))然后在方法中对对象做任何你需要的转换