Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1
    Utente di HTML.it L'avatar di dwb
    Registrato dal
    Mar 2001
    residenza
    My IDE! :)
    Messaggi
    2,898

    Errore deserializzazione array JSon

    Ho preparato questo codice che, al click di un pulsante, dovrebbe restituire dei dati:

    codice:
            protected void Button1_Click(object sender, EventArgs e)
            {
                try
                {
                    var request = HttpWebRequest.Create("https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-andamento-nazionale.json");
    
    
    
    
                    request.ContentType = "text/json";
                    request.Method = "GET";
    
    
                    var httpResponse = (HttpWebResponse)request.GetResponse();
    
    
    
    
                    var StreamReader = new StreamReader(httpResponse.GetResponseStream());
                    var responseText = StreamReader.ReadToEnd();
    
    
    
    
                     
                    CovidClass covidClass = JsonConvert.DeserializeObject<CovidClass>(responseText);
                    int deceduti = covidClass.deceduti;
                    lblStatus.Text = "Totale deceduti: " + deceduti.ToString();
    
    
                }
    
    
                catch (Exception exc)
                {
                    lblStatus.Text = exc.Message.ToString();
                }
    
    
            }
    Classe:
    codice:
            public class CovidClass
            {
                public DateTime data { get; set; }
                public string stato { get; set; }
                public int ricoverati_con_sintomi { get; set; }
                public int terapia_intensiva { get; set; }
                public int totale_ospedalizzati { get; set; }
                public int isolamento_domiciliare { get; set; }
                public int totale_attualmente_positivi { get; set; }
                public int nuovi_attualmente_positivi { get; set; }
                public int dimessi_guariti { get; set; }
                public int deceduti { get; set; }
                public int totale_casi { get; set; }
                public int tamponi { get; set; }
                public string note_it { get; set; }
                public string note_en { get; set; }
            }
    Ma al click mi viene fuori questo errore:

    Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'Study.CovidClass' 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 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.
    ~Il nome di una variabile deve riflettere il suo scopo e non il suo tipo di dati, NET Framework.

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,275
    ciao,
    la risorsa ti restituisce un array del tipo definito, ma tu deserializzi come se fosse un solo elemento.
    Se ciò è corretto (non ho provato) dovresti risolvere deserializzando con una lista del tipo definito:
    codice:
    .DeserializeObject<List<CovidClass>>

  3. #3
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,791
    (piccolo off-topic per spunti ed idee su nuove applicazioni di utilità sociale)

    a cosa serve l'applicazione ?

  4. #4
    Utente di HTML.it L'avatar di dwb
    Registrato dal
    Mar 2001
    residenza
    My IDE! :)
    Messaggi
    2,898
    Quote Originariamente inviata da djciko Visualizza il messaggio
    (piccolo off-topic per spunti ed idee su nuove applicazioni di utilità sociale)

    a cosa serve l'applicazione ?
    A nulla... faccio prove, avendo molto tempo a disposizione.
    ~Il nome di una variabile deve riflettere il suo scopo e non il suo tipo di dati, NET Framework.

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,091
    Un json così non lo avevo ancora disassemblato. Perciò questo è un tentativo (funzionate) da rivedere
    codice:
    Option Strict On
    Imports l = libreria.ModuloWeb
    Imports Newtonsoft.Json
    
    Partial Class prove_a
        Inherits System.Web.UI.Page
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim wc As System.Net.WebClient = Nothing
            Try
                wc = New System.Net.WebClient()
                Dim url As String = "https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-andamento-nazionale.json"
                Dim s As String = "{Propertys:" & wc.DownloadString(url) & "}"
    
                Dim r As Rootobject = If(Not String.IsNullOrWhiteSpace(s), JsonConvert.DeserializeObject(Of Rootobject)(s), New Rootobject())
    
                'stampo data e deceduti
                For Each p In r.Propertys
                    PrintLn(Me.PlaceHolder1, p.deceduti, p.data.ToString)
                Next
    
            Catch ex As Exception
                Me.Label1.Text = l.exMessageErrorForLabel(ex)
            End Try
        End Sub
    
    
    
    
        Public Class Rootobject
            Public Property Propertys As List(Of Class1)
        End Class
    
        Public Class Class1
            Public Property data As Date
            Public Property stato As String
            Public Property ricoverati_con_sintomi As Integer
            Public Property terapia_intensiva As Integer
            Public Property totale_ospedalizzati As Integer
            Public Property isolamento_domiciliare As Integer
            Public Property totale_attualmente_positivi As Integer
            Public Property nuovi_attualmente_positivi As Integer
            Public Property dimessi_guariti As Integer
            Public Property deceduti As Integer
            Public Property totale_casi As Integer
            Public Property tamponi As Integer
            Public Property note_it As String
            Public Property note_en As String
        End Class
    
    End Class
    Pietro

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,091
    Quote Originariamente inviata da U235 Visualizza il messaggio
    ciao,
    la risorsa ti restituisce un array del tipo definito, ma tu deserializzi come se fosse un solo elemento.
    Se ciò è corretto (non ho provato) dovresti risolvere deserializzando con una lista del tipo definito:
    codice:
    .DeserializeObject<List<CovidClass>>
    Non avevo visto la tua risposta.
    Naturalmente funziona!
    Pietro

  7. #7
    Utente di HTML.it L'avatar di dwb
    Registrato dal
    Mar 2001
    residenza
    My IDE! :)
    Messaggi
    2,898
    Non va:

    Error CS0029: Cannot implicitly convert type 'System.Collections.Generic.List<ConsoleTest.Covid Class>' to 'ConsoleTest.CovidClass' (CS0029) (ConsoleTest)

    Ecco il codice modificato:

    codice:
    
    
    codice:
                try
                {
                    var request = HttpWebRequest.Create("https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-andamento-nazionale.json");
    
    
    
    
    
    
    
    
                    request.ContentType = "text/json";
                    request.Method = "GET";
    
    
    
    
                    var httpResponse = (HttpWebResponse)request.GetResponse();
    
    
    
    
    
    
    
    
                    var StreamReader = new StreamReader(httpResponse.GetResponseStream());
                    var responseText = StreamReader.ReadToEnd();
    
    
    
    
    
    
    
    
    
    
                    CovidClass covidClass = JsonConvert.DeserializeObject<List<CovidClass>>(responseText);
                    int deceduti = covidClass.deceduti;
                    Console.WriteLine("Deceduti: " + deceduti.ToString());
                    
    
    
                }

    ~Il nome di una variabile deve riflettere il suo scopo e non il suo tipo di dati, NET Framework.

  8. #8
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,091
    codice:
    Option Strict On
    
    Imports Newtonsoft.Json
    
    Partial Class deserializzo_json_array
        Inherits System.Web.UI.Page
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim wc As System.Net.WebClient = Nothing
            Try
                wc = New System.Net.WebClient()
                'Dim url As String = "https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-andamento-nazionale.json"
                'Dim s As String = wc.DownloadString(url)
                Dim s As String = File.ReadAllText(Server.MapPath("json_array.txt"))
    
                Dim r As List(Of Class1) = If(Not String.IsNullOrWhiteSpace(s), JsonConvert.DeserializeObject(Of List(Of Class1))(s), New List(Of Class1)())
    
                Dim sb As New StringBuilder()
                sb.Append("<table id=""table1"" >")
                sb.Append("<thead><tr>")
                Dim t As Type = GetType(Class1)
                For Each p In t.GetProperties()
                    Dim nome As String = p.Name
                    sb.AppendFormat("<th>{0}</th>", nome)
                Next
                sb.Append("</tr></thead>")
    
                sb.Append("<tbody>")
    
                For Each f In r
                    sb.Append("<tr>")
                    t = f.GetType
                    For Each p In t.GetProperties()
                        Dim nome As String = p.Name
                        Dim tipo As String = p.PropertyType.ToString
    
                        Dim valore As String = l.NullToString(p.GetValue(f, Nothing))
                        sb.AppendFormat("<td class=""center"">{0}</td>", valore)
                    Next
                    sb.Append("</tr>")
                Next
                sb.Append("</tbody>")
                sb.Append("</table>")
    
                Me.Literal1.Text = sb.ToString
    
            Catch ex As Exception
                Me.Label1.Text = l.exMessageErrorForLabel(ex)
            End Try
        End Sub
    
    
        Public Class Class1
            Public Property data As Date
            Public Property stato As String
            Public Property ricoverati_con_sintomi As Integer
            Public Property terapia_intensiva As Integer
            Public Property totale_ospedalizzati As Integer
            Public Property isolamento_domiciliare As Integer
            Public Property totale_attualmente_positivi As Integer
            Public Property nuovi_attualmente_positivi As Integer
            Public Property dimessi_guariti As Integer
            Public Property deceduti As Integer
            Public Property totale_casi As Integer
            Public Property tamponi As Integer
            Public Property note_it As String
            Public Property note_en As String
        End Class
    End Class
    Ultima modifica di djciko; 29-03-2020 a 14:51
    Pietro

  9. #9
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,091
    Il suggerimento di U235 ti assicuro che funziona. Sotto un esempio di codice in basic che fa vedere i dati tabellati.

    codice:
    Option Strict On
    
    Imports Newtonsoft.Json
    
    Partial Class deserializzo_json_array
        Inherits System.Web.UI.Page
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim wc As System.Net.WebClient = Nothing
            Try
                wc = New System.Net.WebClient()
                'Dim url As String = "https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-json/dpc-covid19-ita-andamento-nazionale.json"
                'Dim s As String = wc.DownloadString(url)
                Dim s As String = File.ReadAllText(Server.MapPath("json_array.txt"))
    
                Dim r As List(Of Class1) = If(Not String.IsNullOrWhiteSpace(s), JsonConvert.DeserializeObject(Of List(Of Class1))(s), New List(Of Class1)())
    
                Dim sb As New StringBuilder()
                sb.Append("<table id=""table1"" >")
                sb.Append("<thead><tr>")
                Dim t As Type = GetType(Class1)
                For Each p In t.GetProperties()
                    Dim nome As String = p.Name
                    sb.AppendFormat("<th>{0}</th>", nome)
                Next
                sb.Append("</tr></thead>")
    
                sb.Append("<tbody>")
    
                For Each f In r
                    sb.Append("<tr>")
                    t = f.GetType
                    For Each p In t.GetProperties()
                        Dim nome As String = p.Name
                        Dim tipo As String = p.PropertyType.ToString
    
                        Dim valore As String = l.NullToString(p.GetValue(f, Nothing))
                        sb.AppendFormat("<td class=""center"">{0}</td>", valore)
                    Next
                    sb.Append("</tr>")
                Next
                sb.Append("</tbody>")
                sb.Append("</table>")
    
                Me.Literal1.Text = sb.ToString
    
            Catch ex As Exception
                Me.Label1.Text = l.exMessageErrorForLabel(ex)
            End Try
        End Sub
    
    
        Public Class Class1
            Public Property data As Date
            Public Property stato As String
            Public Property ricoverati_con_sintomi As Integer
            Public Property terapia_intensiva As Integer
            Public Property totale_ospedalizzati As Integer
            Public Property isolamento_domiciliare As Integer
            Public Property totale_attualmente_positivi As Integer
            Public Property nuovi_attualmente_positivi As Integer
            Public Property dimessi_guariti As Integer
            Public Property deceduti As Integer
            Public Property totale_casi As Integer
            Public Property tamponi As Integer
            Public Property note_it As String
            Public Property note_en As String
        End Class
    End Class
    Pietro

  10. #10
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,791
    pietro, è un post doppio ? se si ne tolgo uno

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 © 2020 vBulletin Solutions, Inc. All rights reserved.