none
Que puedo usar para devolver JSON desde VB.NET 2010 ? RRS feed

  • Pregunta

  • Hola,

    Hace años tengo unos web services (asmx) desarrollados en VB, ahora en la version .NET 2010 y evuelven XML a clientes VB .NET 2010 Windows Forms.

    Ahora estoy creando el cliente movil en diversas plataformas y necesito agregar los nuevos web services, que devuelvan JSON.

    Un ejemplo del web service en VB .NET (asmx)

    <WebMethod(EnableSession:=True)> _
    Public Function ManageUsers(ByVal UsrNmb As String, ByVal UsrPwd As String, ) As DPNetDLL.DBProcessor.ReturnValues
        Dim appm As AppMembers = New AppMembers(UsrNmb)
        Return appm.DBProc.ManageUsers(UsrNmb, UsrPwd)
    End Function

     

    Este web service llama a una función "ManageUsers" que está dentro de una DLL y en este caso se encarga del login y devuelve una estructura de datos, que contiene status, roles, información del usuario, etc.

    La pregunta es, para poder devolver JSON en lugar de una estructura de datos que se serializa a XML, que se recomienda usar?, por ahora no me preocupa la parte del cliente, me interesa la generación del resultado JSON desde los web services en VB .NET 2010.

    Vi que hay diversos frameworks JSON de terceros, y no me queda claro si también el FrameWork .NET de Microsoft (3.5 / 4.x) ya tiene incorporado JASON. Si lo tuviera, alguien me puede señalar donde encuentro documentación y ejemplos JSON para VB .NET 2010?

    Si lo recomendado es un Framework de terceros, cual seria el mas recomendado para VB.NET 2010?.

    En cualquier caso, quisiera tener acceso a la documentaciín y ejemplos para VB .NET 2010.

    Muchas gracias.

    Saludos.

    Luis

     

     

     

     

     


    • Editado JonyTolengo viernes, 25 de noviembre de 2011 19:20 Para que quede mas claro
    jueves, 24 de noviembre de 2011 18:40

Respuestas

  • Bueno he conseguido resolverlo.!!!

    Ahora consigo recibir el string JSON dede el cliente VB.NET framework 4.0 y cargarlo en la clase.

    Lo agrego en este comentario, por si a alguien tembien le interesa.

     

    ' Función en VB.NET para recibir la respuesta JSON del web service, deserializarla y cargarla en un la clase.

    Dim TextoJason As String = MyWS.ManageMobileUsers("CSDEMO", "CSDEMO1", "2011.11.27")

    Dim TheMobileUser As New MobileUser

    Dim ms As New MemoryStream(System.Text.Encoding.Unicode.GetBytes(TextoJason))

    Dim serializer As System.Runtime.Serialization.Json.DataContractJsonSerializer = New System.Runtime.Serialization.Json.DataContractJsonSerializer(TheMobileUser.GetType())

    TheMobileUser = serializer.ReadObject(ms)

    ms.Close()

     

    Gracias,

    Saludos.

    Luis

     

     


    Luigye
    • Marcado como respuesta JonyTolengo domingo, 27 de noviembre de 2011 16:26
    domingo, 27 de noviembre de 2011 16:26

Todas las respuestas

  • hola

    si desde un web service devuelves una entidad de negocio, si le pones el atributo ScriptMethod

    <ScriptMethod(ResponseFormat:=ResponseFormat.Json)>

    deberias convertir la entidad en jason

     

    pero tambien podrias devolver un string usando

    Json.Net

    si tiens entidades que armas con tipos anonimos, podrias serialziarlas a json con esta libreria y devolverlas como resultado en un simple string

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 25 de noviembre de 2011 5:02
  • Hola Leandro.
     
    Muchas gracias por tu respuesta, he probado las 2 opciones que me pasaste y ambas funcionaron, gracias.

    Sin embargo, como trabajo con VB, encontré esta opción que tambien funcina y me parece extremamente facil ya que usa el propio Framework de Microsoft incluido en la versión 4.5.

    http://panicoenlaxbox.blogspot.com/2010/11/serializacion-y-deserializacion-de-json.html

    Ahora mi codigo,es este:

    ' Funciones para mobiles en la DLL en el Servidor
     
    Public Function ManageMobileUsers(UsrNmb As String, UsrPwd As String) As String
     
           Dim TheReturnValue As New ReturnValues    ' Estas es una estructura de datos, que devuelve la función en forma general
     
           Dim TheMobileUser As New MobileUser         ' Esta es la clase MobileUser, creada dentro de la DLL
     
           TheReturnValue = ManageUsers(UsrNmb, UsrPwd, "", "", "")    '  Voy a hacer el login del usuario (esta función está en una DLL)
     
           TheMobileUser = TheReturnValue.MobileUser                           ' Tomo solo la información que quiero devolver al cliente móvil.
     
           ' Acá transformo la info para JSON.
     
           Dim Serializador As New System.Runtime.Serialization.Json.DataContractJsonSerializer(TheMobileUser.GetType)
     
           Dim Ms As New System.IO.MemoryStream
     
           Serializador.WriteObject(Ms, TheMobileUser)
     
           Dim TheStringJson As String = System.Text.Encoding.UTF8.GetString(ms.ToArray)
     
           Return TheStringJson
     
    End Function
     
    .... y este es mi web service:
     
     
     
    Imports My
     Imports System.Web
     Imports System.Web.Services
     Imports System.Web.Services.Protocols
     Imports System.Xml
     Imports System.Data
     Imports System.IO
     Imports System.Windows.Forms
     Imports Microsoft.AnalysisServices
     Imports Utilities.Utilities
     Imports System.Diagnostics
     
    <WebService(Namespace:="http://tempuri.org/")> _
     <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
     <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
     Public Class DPNetServices
         Inherits System.Web.Services.WebService

        ' Web Services para mobiles
     
        <WebMethod(EnableSession:=True)> _
         Public Function ManageMobileUsers(ByVal UsrNmb As String, ByVal UsrPwd As String, ByVal Release As String) As String
     
            Dim appm As AppMembers = New AppMembers(, , , , , , , , True, UsrNmb, Release)
             Return appm.DBProc.ManageMobileUsers(UsrNmb, UsrPwd)
     
        End Function
     
    End Class
     
    .... y esta es la respuesta, cuando lo consumo manualmente desde un browser:
     
     
     
     
     
    <?xml version="1.0" encoding="UTF-8"?>
     <string xmlns="{"name":"Administrador" _mce_href="http://tempuri.org/">{"name":"Administrador">http://tempuri.org/">{"name":"Administrador del Sistema","rol":0,"status":"OK","userId":"CSDEMO"}</string>
     
     
     
    Como puedes, ver si bien se genera correctamente el resultado JSON, está encapsulado dentro de un XML, y obviamente no es lo que espero en el cliente móvil.
     
     
     
    En el movil espero exactamente esto:
     
     
     
    {
      "name": "Administrador del Sistema",
      "rol": 0,
      "status": "OK",
      "userId": "CSDEMO"
     }
     
    Estoy confundido, porque el retorno del web service se encapsula dentro de un xml?, donde me equivoce?
     
    Como hago para que el web service retorne el puro JSON ?
     
    Agradezco cualquier ayuuda.
     
    Saludos.
     
    Luis
     
    --------------------------------------------------------------------------------

     

     

    Luigye


    • Editado JonyTolengo viernes, 25 de noviembre de 2011 19:30 para que quede mas claro
    viernes, 25 de noviembre de 2011 18:55
  • pero cuando obtieens este json con el xml desde donde estas invocando al servicio ?

     

    porque no lo haces usando $.ajax, de jquery, no lo invoques desde un proxy creado en .net o desde el browser con la pagina de prueba porque estos agfregan el xml del mensaje SOAP

    jQuery – DropDownList anidados (nested DropDownList

    veras en el link un ejemplo aplicando $.ajax para invocar un servicio

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 26 de noviembre de 2011 4:14
  • Hola, gracias por tu post, me ha sido muuy util para enviar una respuesta JSON desde web services escritos en VB.NET y me quedó claro lo que me comentas de probar con el browser.

    Ahora necesito hacer en el cliente VB.NET 2010 que ya tengo, una función que deserialize la respuesta JSON.

    Me puedes ayudar con respecto a como seria la función para deserializar la respuesta JSON?

     

    Mi función para serializar dentro de una DLL quedó asi:

     

    Public Function ManageMobileUsers(UsrNmb As String, UsrPwd As String) As String

             Dim TheReturnValue As New ReturnValues
             Dim TheMobileUser As New MobileUser

             TheReturnValue = ManageUsers(UsrNmb, UsrPwd)  ' Aqui viene una estructura de datos con cosas de mas
             TheMobileUser = TheReturnValue.MobileUser  ' Aqui vienen cargadas las propiedades de la clase que quiero serializar en JSON.

             Dim Serializador As New System.Runtime.Serialization.Json.DataContractJsonSerializer(TheMobileUser.GetType)

             Dim Ms As New System.IO.MemoryStream

             Serializador.WriteObject(Ms, TheMobileUser)

             Dim TheStringJson As String = System.Text.Encoding.UTF8.GetString(ms.ToArray)

             Return TheStringJson

    End Function

     

    El Web Service quedó así:


        ' Web Services para mobiles

        <WebMethod(EnableSession:=True)> _
        <ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _
        Public Function ManageMobileUsers(ByVal UsrNmb As String, ByVal UsrPwd As String, ByVal Release As String) As String

            Dim appm As AppMembers = New AppMembers(True, UsrNmb)

            Return appm.DBProc.ManageMobileUsers(UsrNmb, UsrPwd) ' Esta función ya devuelve JSON

        End Function

     

    Esta es la clase que serializo y necesito deserializar:

    Public Class MobileUser

        Private _status As String

        Public Property status() As String

            Get

                Return _status

            End Get

            Set(ByVal value As String)

                _status = value

            End Set

        End Property

        Private _userId As String

        Public Property userId() As String

            Get

                Return _userId

            End Get

            Set(ByVal value As String)

                _userId = value

            End Set

        End Property

        Private _name As String

        Public Property name() As String

            Get

                Return _name

            End Get

            Set(ByVal value As String)

                _name = value

            End Set

        End Property

        Private _rol As Integer

        Public Property rol() As Integer

            Get

                Return _rol

            End Get

            Set(ByVal value As Integer)

                _rol = value

            End Set

        End Property

    End Class

     

    Yo necesito hacer todo en VB.NET 2010, pues es donde tengo la aplicacion funcionando hace años.

    La idea es ir cambiando las respuestas XML x JSON, en cada uno de los web services.

    Haciendo este, despues hago todos los demas.

    Muchas gracias por tu ayuda.

    Saludos.

    Luis

     

     

     

     

     

     


    Luigye
    sábado, 26 de noviembre de 2011 22:54
  • Bueno he conseguido resolverlo.!!!

    Ahora consigo recibir el string JSON dede el cliente VB.NET framework 4.0 y cargarlo en la clase.

    Lo agrego en este comentario, por si a alguien tembien le interesa.

     

    ' Función en VB.NET para recibir la respuesta JSON del web service, deserializarla y cargarla en un la clase.

    Dim TextoJason As String = MyWS.ManageMobileUsers("CSDEMO", "CSDEMO1", "2011.11.27")

    Dim TheMobileUser As New MobileUser

    Dim ms As New MemoryStream(System.Text.Encoding.Unicode.GetBytes(TextoJason))

    Dim serializer As System.Runtime.Serialization.Json.DataContractJsonSerializer = New System.Runtime.Serialization.Json.DataContractJsonSerializer(TheMobileUser.GetType())

    TheMobileUser = serializer.ReadObject(ms)

    ms.Close()

     

    Gracias,

    Saludos.

    Luis

     

     


    Luigye
    • Marcado como respuesta JonyTolengo domingo, 27 de noviembre de 2011 16:26
    domingo, 27 de noviembre de 2011 16:26
  • pero cuando obtieens este json con el xml desde donde estas invocando al servicio ?

     

    porque no lo haces usando $.ajax, de jquery, no lo invoques desde un proxy creado en .net o desde el browser con la pagina de prueba porque estos agfregan el xml del mensaje SOAP

    jQuery – DropDownList anidados (nested DropDownList

    veras en el link un ejemplo aplicando $.ajax para invocar un servicio

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Gracias....MUY BUEN COMENTARIO EL DE CONSUMIR EL CONSUMIR EL SERVICIO CON EL BROWSER, me abrió la mente, para lograr la solución.
    Luigye
    domingo, 27 de noviembre de 2011 16:29