Deserializar Array Json con vb.net

Deserializar Array Json con vb.net

Primeramente definimos el tipo JSON a descargar

Public Class Nodo
    Public id As Long
    Public Titulo As String
End Class

A continuación leemos de una URL el webservice JSON y o recorremos para cada item del contenido


Dim request As HttpWebRequest
Dim response As HttpWebResponse = Nothing
Dim reader As StreamReader
request = DirectCast(WebRequest.Create(URL), HttpWebRequest)

response = DirectCast(request.GetResponse(), HttpWebResponse)
reader = New StreamReader(response.GetResponseStream())
Devuelve = reader.ReadToEnd()

Dim nodos() As Nodo = JsonConvert.DeserializeObject(Of Nodo())(Devuelve)

Dim count As Long = nodos.Length
For i = 0 To count - 1
     Devuelve = nodos(i).Titulo
Next

reader.Close()

6 comentarios

  1. Jesus

    Ayuda por favor, segui tu ejemplo pero me manda un error estoy trabajando en VB ASP net 2015.

    pero marca el error al declarar

    Dim dt() As Recargas = JsonConvert.DeserializeObject(Of Recargas())(raw)

    Cree una clase llamada

    Public Class Recargas
    Public ID As String
    Public Bolsa As String
    Public Saldo As String
    End Class

    el error es,

    Cannot deserialize the current JSON object (e.g. {«name»:»value»}) into type ‘Recargas[]’ because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
    To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
    Path ‘success’, line 1, position 11.

  2. Angel Alcaide

    Hola Jesús.
    Lo que miraría es qué te devuelve el servicio web, osea el resultado del json que estás leyendo debería ser:
    [
    {
    «ID»: «1»,
    «Bolsa»:»bolsa1″,
    «Saldo»:122.3959,
    },
    {
    «ID»: «2»,
    «Bolsa»:»bolsa2″,
    «Saldo»:122.3959,
    }
    ]

    En caso de que exista otra anidación o un vector de cabecera:
    la clase se compondría tal cual el resultado del JSON
    [
    «Recargas»: {
    {
    «ID»: «1»,
    «Bolsa»:»bolsa1″,
    «Saldo»:122.3959,
    },
    {
    «ID»: «2»,
    «Bolsa»:»bolsa2″,
    «Saldo»:122.3959,
    }
    }
    ]

  3. jesus

    Buen dia, Angel primero que nada gracias por contestar la duda, el json lo regresa correcto, lo he revisado en postman y en mi resultado de en VB asp net, si me lo regresa correcto. El problema es al deserializarlo me marca eso ,he investigado y segun que lo debo de tratar como array,

    {
    «success»: true,
    «error»: 0,
    «message»: «Consulta Exitosa»,
    «data»: [
    {
    «ID»: «1»,
    «Bolsa»: «Tiempo Aire»,
    «Saldo»: «96.16»
    },
    {
    «ID»: «2»,
    «Bolsa»: «Pago de Servicios»,
    «Saldo»: «52.85»
    },
    {
    «ID»: «3»,
    «Bolsa»: «Timbres CFDI»,
    «Saldo»: «1,010.00»
    }
    ],
    «extra»: null
    }

    Asi esta parte de mi codigo como lo pones en tu ejemplo.

    ‘ Get the response stream into a reader
    reader = New StreamReader(response.GetResponseStream())

    Dim Devuelve As String = reader.ReadToEnd()

    TextBox2.Text = Devuelve ‘aqui lo pongo para visualizarlo y sale correcto el json tal cual como el postman

    ‘ Solo que si dejo estas lineas inmediatamente me marca el error
    Dim nodos() As Nodo = JsonConvert.DeserializeObject(Of Nodo())(Devuelve)

    Dim count As Long = nodos.Length
    For i = 0 To count – 1
    Devuelve = nodos(i).ID
    Next

    reader.Close()

    Sigo intentado resolverlo. agradezo tu apoyo.

  4. Angel ALCAIDE

    Solo se me ocurre que con ayuda de la funcion String.Split limpies la cadena resultado, saltando hasta el corchete y dejando solo el contenido entre estos corchetes, borra la última llave. La cadena resultado trátala con la clase adecuada finalmente.

  5. JesusP

    Buen dia Jesus , como resolviste tu problema , ya que me manda el mismo error que comentas, como es que dices que declaraste como Lista??
    Gracias de antemano

Deja una respuesta