我尝试使用返回JSON消息的Web服务。每个方法都返回相关的JSON消息(通常是数组)或JSON错误消息(不是数组)。
UserList和错误消息的示例:
[
{
"id":1,
"login":"john1",
"full_name":"John Smith"
},
{
"id":2,
"login":"anne",
"full_name":"Anne Steward"
}
]
{
"success":false,
" message":"Unknown login"
}
因为代码不知道期望哪个消息,所以我创建了两个类,其中UserList继承自BaseResponse(错误消息类)。我使用了继承,因为所有其他方法(如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)
如何以聪明的方式解决这个问题?
答案 0 :(得分:1)
如果你确定你的两个返回类正在正确地反序列化json,你只需要本质上:"我是一个列表还是一个字符串?"要求一条路或另一条路。
编辑8-30 好的,所以我错过了你不知道,直到它被执行,我的坏。您可以在Sub Routine中执行逻辑而不是函数,然后直接在检查传递的通用对象上执行逻辑。与此类似。
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
基本上你只需要直接在方法中转换你的JSON' DetermineReturn'而不是Console.WriteLines。我在解释' obj'传入,使用反射来获得它的类型,然后可以安全地转换为该类型。因此,您可以将JSON返回的参数放在像DetermineReturn((YourJSONResult))这样的方法中,然后在方法内部执行对象所需的任何变换。