反序列化两种类型的JSON消息



我尝试使用返回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))然后在方法中对对象做任何你需要的转换

相关内容

  • 没有找到相关文章

最新更新