反序列化两种类型

时间:2016-08-29 14:10:59

标签: json vb.net json.net

我尝试使用返回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)

如何以聪明的方式解决这个问题?

1 个答案:

答案 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))这样的方法中,然后在方法内部执行对象所需的任何变换。