Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [VB.NET] Problema con parsing JSON e classe custom

    ciao!

    ho un problema con la conversione di un JSON e una classe custom che è questa:
    codice:
    Public Class Book
        Public title As String
        Public author As String
    End Class
    questo il codice:
    codice:
    Imports System.Net.Http
    Imports Newtonsoft.Json
    
    Module Module1
    
        Sub Main()
            Dim t As Task = New Task(AddressOf SendRequest)
            t.Start()
            Console.WriteLine("Inizio richiesta")
            Console.ReadLine()
        End Sub
    
        Async Sub SendRequest()
            Dim uri As New Uri("https://www.mattepuffo.com/service/book/all_books.php")
            Dim books As List(Of Book) = New List(Of Book)
            Using client As HttpClient = New HttpClient
                Using response As HttpResponseMessage = Await client.GetAsync(uri)
                    Using content As HttpContent = response.Content
                        Dim result As String = Await content.ReadAsStringAsync()
                        If result IsNot Nothing Then
                            Dim json As String = result.ToString()
                            Dim list As List(Of Book) = JsonConvert.DeserializeObject(json)
                            For Each item As Book In list
                                books.Add(list) ' PROBLEMA
                            Next
                        End If
                    End Using
                End Using
            End Using
        End Sub
    
    End Module
    il problema è nella riga indicata, mi dice che Non è possibile convertire il valore di tipo 'List(Of Book)' in 'Book'.
    venendo dal C#, ho un pò di problemi con la sintassi, quindi magari ho sbagliato a tradurre un codice di esempio simile che avevo in C#.
    suggerimenti??

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,082
    Non stai aggiungendo un Book ad una lista di Book, ma stai aggiungendo una Lista di Book ad una Lista di Book.

    codice:
    For Each item As Book In list
       books.Add(list) ' Forse volevi scrivere 'item' al posto di 'list'
    Next

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    si scusate, ma sta sintassi non riesco a digerirla e faccio degli errori stupidi:

    però ho comunque un problema:
    codice:
                        Dim result As String = Await content.ReadAsStringAsync()
                        If result IsNot Nothing Then
                            Dim json As String = result.ToString()
                            Dim list As List(Of Book) = JsonConvert.DeserializeObject(json) 'PROBLEMA RIGA 22
                            For Each item As Book In list
                                books.Add(item)
                            Next
                        End If
    mi da questa eccezione:
    codice:
    Eccezione non gestita: System.InvalidCastException: Impossibile eseguire il cast di oggetti di tipo 'Newtonsoft.Json.Linq.JArray' sul tipo 'System.Collections.Generic.List`1[VBTest.Book]'.
       in VBTest.Module1.VB$StateMachine_1_SendRequest.MoveNext() in C:\VS_Proj\VBTest\VBTest\Module1.vb:riga 22
    --- Fine traccia dello stack da posizione precedente dove è stata generata l'eccezione ---
       in System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.<ThrowAsync>b__6_1(Object state)
       in System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
       in System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       in System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       in System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
       in System.Threading.ThreadPoolWorkQueue.Dispatch()
       in System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
    la riga 22 è quella ho indicato.

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,826
    Quote Originariamente inviata da fermat Visualizza il messaggio
    codice:
                        Dim result As String = Await content.ReadAsStringAsync()
                        If result IsNot Nothing Then
                            Dim json As String = result.ToString()
                            Dim list As List(Of Book) = JsonConvert.DeserializeObject(json) 'PROBLEMA RIGA 22
                            For Each item As Book In list
                                books.Add(item)
                            Next
                        End If
    mi da questa eccezione:
    [code]
    Eccezione non gestita: System.InvalidCastException: Impossibile eseguire il cast di oggetti di tipo 'Newtonsoft.Json.Linq.JArray' sul tipo 'System.Collections.Generic.List`1[VBTest.Book]'.
    Devi usare l'overload del metodo DeserializeObject che accetta come parametro generico il tipo effettivo che deve essere creato e in cui devono essere copiati i valori dal formato JSON.

    Vedi la documentazione qui.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Delphi Succinctly (e-book)

  5. #5
    allora, questo mi da l'errore di prima (Non è possibile convertire il valore di tipo 'List(Of Book)' in 'Book'):
    codice:
    Dim list As List(Of Book) = JsonConvert.DeserializeObject(Of Book)(json)
    se faccio così:
    codice:
    Dim list As Book = JsonConvert.DeserializeObject(Of Book)(json)
    ottengo questo:
    codice:
    Eccezione non gestita: Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'VBTest.Book' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
    To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.
    Path '', line 1, position 1.
       in Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureArrayContract(JsonReader reader, Type objectType, JsonContract contract)
       in Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id)
       in Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
       in Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
       in Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
       in Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
       in Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
       in Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value)
       in VBTest.Module1.VB$StateMachine_1_SendRequest.MoveNext() in C:\VS_Proj\VBTest\VBTest\Module1.vb:riga 23
    --- Fine traccia dello stack da posizione precedente dove è stata generata l'eccezione ---
       in System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.<ThrowAsync>b__6_1(Object state)
       in System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
       in System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       in System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       in System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
       in System.Threading.ThreadPoolWorkQueue.Dispatch()
       in System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
    considerando che la struttura del JSON è questa:
    codice:
    [
     {...},
     {...},
    ]

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,082
    Prendila con le pinze dato che non programmo in .NET, ma se a sinistra dell'uguale hai una lista di oggetti libro, a destra dovrai avere una lista di oggetti libro, non un libro.

    Quindi, a naso dovrebbe essere così (o simile):

    codice:
    Dim list As List(Of Book) = JsonConvert.DeserializeObject(Of List(Of Book))(json)

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Prendila con le pinze dato che non programmo in .NET, ma se a sinistra dell'uguale hai una lista di oggetti libro, a destra dovrai avere una lista di oggetti libro, non un libro.

    Quindi, a naso dovrebbe essere così (o simile):

    codice:
    Dim list As List(Of Book) = JsonConvert.DeserializeObject(Of List(Of Book))(json)

    Ciao.
    funziona alla perfezione.
    grazie mille!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.