WebService Asp.Net Json没有序列化List(Of Class)

时间:2014-01-11 17:11:15

标签: json vb.net web-services list asmx

经过大量的时间在网上和网上搜索,我发布了我的问题,我的代码告诉我我是如何做到的。

问题是Json没有序列化listUsuarios,当我使用JavaScriptSerializer时返回为“{}”,当我使用JsonConvert.SerializeObject时返回为“False”。

抱歉我的英语不好。

这是代码......

USUARIOS.VB

Imports Microsoft.VisualBasic

Public Class Usuarios
    Private _Codigo As Long
    Private _Nome As String
    Private _Telefone As String

    Public Property Codigo As Integer
        Get
            Return _Codigo
        End Get
        Set(ByVal value As Integer)
            _Codigo = value
        End Set
    End Property

    Public Property Nome() As String
        Get
            Return _Nome
        End Get
        Set(ByVal value As String)
            _Nome = value
        End Set
    End Property

    Public Property Telefone() As String
        Get
            Return _Telefone
        End Get
        Set(ByVal value As String)
            _Telefone = value
        End Set
    End Property
End Class

Public Class ListUsuarios
    Private listUsuarios As List(Of Usuarios)

    Public Sub New()
        listUsuarios = New List(Of Usuarios)
    End Sub

    Public Sub AddItem(ByVal usuario As Usuarios)
        listUsuarios.Add(usuario)
    End Sub

    Protected Overrides Sub Finalize()
        MyBase.Finalize()
    End Sub

    Public Function Item(ByVal Index As Integer) As Usuarios
        Return CType(listUsuarios.Item(Index), Usuarios)
    End Function

    Public Function Count() As Integer
        Return listUsuarios.Count
    End Function
End Class

ANDROID.VB

Imports Newtonsoft.Json
Imports System.Configuration
Imports System.Data
Imports System.Data.OleDb
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Xml

' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
<System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class Android
    Inherits System.Web.Services.WebService

    Dim Dt As DataTable
    Dim Da As New OleDbDataAdapter
    Dim Cmd As New OleDbCommand
    Dim cn As New OleDb.OleDbConnection

    <WebMethod()> _
    Public Function Android(query As String) As String
        Dim listUsuario As ListUsuarios = carregaDadosAccess(query)
        Return retornaDadosJSON(listUsuario)
    End Function

    Private Function getConexaoDB() As OleDbConnection
        Try
            cn.ConnectionString = ConfigurationManager.ConnectionStrings("MyLocalAccess").ConnectionString
            cn.Open()
            Return cn
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Private Sub closeConexaoDB(ByVal cn As OleDbConnection)
        Try
            If cn.State = ConnectionState.Open Then
                cn.Close()
            End If
        Catch ex As Exception
            Throw ex
        End Try
    End Sub

    Private Function carregaDadosAccess(selectCommmand As String) As ListUsuarios
        Dim usuario As Usuarios = Nothing
        Dim listUsuario As New ListUsuarios
        Dim i As Long = 0

        Try
            cn = getConexaoDB()
            Dim da As New OleDb.OleDbDataAdapter(selectCommmand, cn)
            Dim dt As New DataTable
            Dim arrImage() As Byte = Nothing
            Dim myMS As New IO.MemoryStream

            da.Fill(dt)

            If dt.Rows.Count > 0 Then
                Do
                    usuario = New Usuarios
                    usuario.Codigo = dt.Rows(i).Item("key-codigo")
                    usuario.Nome = dt.Rows(i).Item("dad-descri")
                    usuario.Telefone = dt.Rows(i).Item("dad-telefo")

                    listUsuario.AddItem(usuario)

                    i = i + 1
                    If i = dt.Rows.Count Then Exit Do
                Loop
            Else
                listUsuario = Nothing
            End If
        Catch ex As Exception
            Throw ex
        Finally
            closeConexaoDB(cn)
        End Try

        Return listUsuario
    End Function

    Private Function retornaDadosJSON(listUsuario As ListUsuarios) As String
        'Json serializer do próprio .net
        'Dim JsonSerializer As New JavaScriptSerializer
        'Return JsonSerializer.Serialize(listUsuario)

        'Json serializer James Newton-King
        Dim JsonSerializer As String = ""
        Return JsonSerializer = JsonConvert.SerializeObject(listUsuario)
    End Function

End Class

1 个答案:

答案 0 :(得分:0)

第一个问题是您返回一个值,该值将空字符串与序列化的json字符串进行比较,并且因为json序列化字符串不为空。这就是“假”的结果来自。

您可以通过将方法更改为:

来解决该问题
Private Function retornaDadosJSON(listUsuario As ListUsuarios) As String
    Return JsonConvert.SerializeObject(listUsuario)
End Function

您可以通过在每个文件的顶部添加以下指令来防止此类问题:

Option Explicit On
Option Strict On

或通过在项目的Compile属性页面中设置相应的值(您也可以在Visual Studio的工具&gt;选项&gt;项目和解决方案&gt; VB默认值中)将这些值设置为新项目的默认值。

Option Strict On会阻止该代码编译。它还会向您显示_ CodigoCodigo之间存在数据类型差异(一个是Long,另一个是Integer)。

第二个问题是ListUsuarios没有很好地定义你正在尝试用它做什么。继承List(Of Usuarios)比你当前的设计好得多。

更改为以下类将减少代码并确保数据正确序列化:

Public Class ListUsuarios
    Inherits List(Of Usuarios)

    Public Sub AddItem(ByVal usuario As Usuarios)
        Me.Add(usuario)
    End Sub

End Class