Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,800

    Deserializzare Json da API

    Ciao, ho un metodo di un'API che restituisce un array di oggetti.

    Questa la chiamata in POST al metodo:

    codice:
    WebClient client = new WebClient();
    
    Classe dati_input = new Classe();
    
    client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
    byte[] byteArray = Encoding.ASCII.GetBytes(dati_input);
    
    
    byte[] responseArray = client.UploadData(uriString, "POST", byteArray);
    string dati_temp = Encoding.ASCII.GetString(responseArray);
    
    
    ClasseOutput classe_output = JsonConvert.DeserializeObject<ClasseOutput>(dati_temp); <<--- PROBLEMA


    Ora, l'oggetto <classe_output> non riesce ad essere valorizzato dalla serializzazione.


    Il JSON che viene restituito dalla chiamata è:
    codice:
    {
        "IFAGE00201": {
            "UTERET_profilo_rete_comm": "IFAGE00201",
            "DTAIAR_data_da": "20180101",
            "DTAFAR_data_a": "20491231",
            "QALRET_qualifica_rete": "COL",
            "CDCLAR_cod_controparte": "AGE002",
            "ndg_cdclar": "",
            "RASOC_ragione_sociale": "AGENTE SPECIAL FASCIA 1",
            "FILARE_filiale": "01",
            "CDLIAR_cod_controp_liquid": "AGE002",
            "ndg_cdliar": "",
            "UTPDAR_utente_padre": "IFIFI00101",
            "ndg_utpdar": "",
            "GRURET_gruppo_appartenenza": "",
            "AIREC_abilitato_caricamento": "S",
            "ACFRE_abilitato_caricamento_figli": "",
            "dataRif": "20201010",
            "XCDRES_responsabile": "AP",
            "listaProdottiAbilit": "C2,CA,CB,CC,CF,CH,CI,CN,DA,DB,DC,DH,DI,FI,PE,PN,PR,PS,PT,PU",
            "obbligoFinanziato": ""
        }
    }

    E' un array di oggetti.

    Domanda: perchè il metodo DeserializeObject non riesce a deserializzarlo ?
    Dice che il formato del json non è valido.

    Ho provato anche con un array di stringhe (string[]) ma niente, non capisce il JSON.
    Devo eliminare qualche parentesi o metterci quelle quadre ?


    Ho provato anche:

    List<ClasseOutput> classe_output = JsonConvert.DeserializeObject<List<ClasseOutput>>(dati_temp);

    ma nulla.
    Ultima modifica di djciko; 22-09-2020 a 22:48

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,275
    Ciao djciko,
    Forse non ho ben capito io, ma il json restituito non è ne una classe con un tipo singolo e ne un array, per cui mi è venuto il dubbio che il problema possa essere li, quindi sarebbe necessario controllare anche la classe che usi per de-serializzare.
    Dovrebbe essere una cosa del genere :
    codice:
    public class Rootobject
        {
            public IFAGE00201 IFAGE00201 { get; set; }
        }
    
    
        public class IFAGE00201
        {
            public string UTERET_profilo_rete_comm { get; set; }
            public string DTAIAR_data_da { get; set; }
            public string DTAFAR_data_a { get; set; }
            public string QALRET_qualifica_rete { get; set; }
            public string CDCLAR_cod_controparte { get; set; }
            public string ndg_cdclar { get; set; }
            public string RASOC_ragione_sociale { get; set; }
            public string FILARE_filiale { get; set; }
            public string CDLIAR_cod_controp_liquid { get; set; }
            public string ndg_cdliar { get; set; }
            public string UTPDAR_utente_padre { get; set; }
            public string ndg_utpdar { get; set; }
            public string GRURET_gruppo_appartenenza { get; set; }
            public string AIREC_abilitato_caricamento { get; set; }
            public string ACFRE_abilitato_caricamento_figli { get; set; }
            public string dataRif { get; set; }
            public string XCDRES_responsabile { get; set; }
            public string listaProdottiAbilit { get; set; }
            public string obbligoFinanziato { get; set; }
        }
    Quindi ad essere de-serializzata dovrebbe essere la class rootobject secondo l'esempio sopra, e nel caso sia un array di rootobject (non ho capito, magari intendevi quello) devi utilizzare un List<rootobject>
    codice:
    JsonConvert.DeserializeObject<List<rootobject>>
    Il quel caso il json dovrebbe essere dentro le quadre:
    codice:
    [{
        "IFAGE00201": {
            "UTERET_profilo_rete_comm": "IFAGE00201",
            "DTAIAR_data_da": "20180101",
            "DTAFAR_data_a": "20491231",
            "QALRET_qualifica_rete": "COL",
            "CDCLAR_cod_controparte": "AGE002",
            "ndg_cdclar": "",
            "RASOC_ragione_sociale": "AGENTE SPECIAL FASCIA 1",
            "FILARE_filiale": "01",
            "CDLIAR_cod_controp_liquid": "AGE002",
            "ndg_cdliar": "",
            "UTPDAR_utente_padre": "IFIFI00101",
            "ndg_utpdar": "",
            "GRURET_gruppo_appartenenza": "",
            "AIREC_abilitato_caricamento": "S",
            "ACFRE_abilitato_caricamento_figli": "",
            "dataRif": "20201010",
            "XCDRES_responsabile": "AP",
            "listaProdottiAbilit": "C2,CA,CB,CC,CF,CH,CI,CN,DA,DB,DC,DH,DI,FI,PE,PN,PR,PS,PT,PU",
            "obbligoFinanziato": ""
        },
    {
        "IFAGE00201": {
            "UTERET_profilo_rete_comm": "IFAGE00201",
            "DTAIAR_data_da": "20180101",
            "DTAFAR_data_a": "20491231",
            "QALRET_qualifica_rete": "COL",
            "CDCLAR_cod_controparte": "AGE002",
            "ndg_cdclar": "",
            "RASOC_ragione_sociale": "AGENTE SPECIAL FASCIA 1",
            "FILARE_filiale": "01",
            "CDLIAR_cod_controp_liquid": "AGE002",
            "ndg_cdliar": "",
            "UTPDAR_utente_padre": "IFIFI00101",
            "ndg_utpdar": "",
            "GRURET_gruppo_appartenenza": "",
            "AIREC_abilitato_caricamento": "S",
            "ACFRE_abilitato_caricamento_figli": "",
            "dataRif": "20201010",
            "XCDRES_responsabile": "AP",
            "listaProdottiAbilit": "C2,CA,CB,CC,CF,CH,CI,CN,DA,DB,DC,DH,DI,FI,PE,PN,PR,PS,PT,PU",
            "obbligoFinanziato": ""
        }
    }]
    Ma è sempre meglio restituire un oggetto che dentro contiene una proprietà come array
    Ultima modifica di U235; 23-09-2020 a 02:21

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,275
    Siccome il mio post precedente non risulta visibile provo ad aggiungere un post.

    ciao

  4. #4
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,800
    il post e' visibile.


    Semplicemente, il JSON rappresenta un array di persone, ma è strano.
    Stavo usando le classi:

    codice:
        public class containerRamiRete
        {
            public out_ramoRete ramo { get; set; }
        }
    
    
        public class out_ramoRete
        {
            public IList<nodoRete> listaAgenti { get; set; }
        }
    
    
        public class nodoRete
        {
            public string UTERET_profilo_rete_comm { get; set; }
            public string DTAIAR_data_da { get; set; }
            public string DTAFAR_data_a { get; set; }
            public string QALRET_qualifica_rete { get; set; }
            public string CDCLAR_cod_controparte { get; set; }
            public string ndg_cdclar { get; set; }
            public string RASOC_ragione_sociale { get; set; }
            public string FILARE_filiale { get; set; }
            public string CDLIAR_cod_controp_liquid { get; set; }
            public string ndg_cdliar { get; set; }
            public string UTPDAR_utente_padre { get; set; }
            public string ndg_utpdar { get; set; }
            public string GRURET_gruppo_appartenenza { get; set; }
            public string AIREC_abilitato_caricamento { get; set; }
            public string ACFRE_abilitato_caricamento_figli { get; set; }
            public string dataRif { get; set; }
            public string XCDRES_responsabile { get; set; }
            public string listaProdottiAbilit { get; set; } // [CA”,”CB”,”DA”] // prodotti abilitati
            public string obbligoFinanziato { get; set; }
        }

    ma alle istruzioni:

    codice:
      
    
    // PROVA 1 -----------------------------------------------------------------------------------------
    // aaaa contiente un oggetto di tipo <out_ramoRete> = NULL
    
    List<out_ramoRete> nodo1 = JsonConvert.DeserializeObject<List<out_ramoRete>>(dati);
    
    
    
    // PROVA 2 -----------------------------------------------------------------          
    //Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[ApiClient2.nodoRete]' 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<T>) 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 'IFAGE00201', line 1, position 14.'
    
    
    List<nodoRete> nodo2 = JsonConvert.DeserializeObject<List<nodoRete>>(dati);



    ....Restituiva gli errori che ho riportato commentati sopra l'istruzione.


    Poi, grazie a StackOverflow, ho incontrato: https://json2csharp.com e l'ho fatto funzionare.

    Vedo che il tuo esempio è preso da li' (ero da 3 giorni e sono contemporaneamente arrivato alla soluzione).

    Ho solo alcuni dubbi, poi li chiariro' con la software house che ha sviluppato le API.

    Grazie.





    Ah, un'altra istruzione funzionava, provala:

    codice:
    // restituisce un Newtonsoft.Json.Linq.JObject 
    dynamic ramoreteOut = JsonConvert.DeserializeObject(dati);

    ma non sapevo maneggiare l'oggetto di ritorno (Newtonsoft.Json.Linq.JObject ??)
    Ultima modifica di djciko; 23-09-2020 a 16:35

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,275
    Quote Originariamente inviata da djciko Visualizza il messaggio
    il post e' visibile.
    Io lo vedevo solo entrando dentro il post, ma non risultava nemmeno come ultimo messaggio, ne nella lista degli ultimi messaggi finché non ho aggiunto il secondo post. Questo sia dopo che l'ho scritto stanotte sia fino a poco fa. Poi non so

    Quote Originariamente inviata da djciko Visualizza il messaggio
    Semplicemente, il JSON rappresenta un array di persone, ma è strano.
    Stavo usando le classi:

    codice:
        public class containerRamiRete
        {
            public out_ramoRete ramo { get; set; }
        }
    
    
        public class out_ramoRete
        {
            public IList<nodoRete> listaAgenti { get; set; }
        }
    
    
        public class nodoRete
        {
            public string UTERET_profilo_rete_comm { get; set; }
            public string DTAIAR_data_da { get; set; }
            public string DTAFAR_data_a { get; set; }
            public string QALRET_qualifica_rete { get; set; }
            public string CDCLAR_cod_controparte { get; set; }
            public string ndg_cdclar { get; set; }
            public string RASOC_ragione_sociale { get; set; }
            public string FILARE_filiale { get; set; }
            public string CDLIAR_cod_controp_liquid { get; set; }
            public string ndg_cdliar { get; set; }
            public string UTPDAR_utente_padre { get; set; }
            public string ndg_utpdar { get; set; }
            public string GRURET_gruppo_appartenenza { get; set; }
            public string AIREC_abilitato_caricamento { get; set; }
            public string ACFRE_abilitato_caricamento_figli { get; set; }
            public string dataRif { get; set; }
            public string XCDRES_responsabile { get; set; }
            public string listaProdottiAbilit { get; set; } // [CA”,”CB”,”DA”] // prodotti abilitati
            public string obbligoFinanziato { get; set; }
        }

    ma alle istruzioni:

    codice:
      
    
    // PROVA 1 -----------------------------------------------------------------------------------------
    // aaaa contiente un oggetto di tipo <out_ramoRete> = NULL
    
    List<out_ramoRete> nodo1 = JsonConvert.DeserializeObject<List<out_ramoRete>>(dati);
    
    
    
    // PROVA 2 -----------------------------------------------------------------          
    //Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[ApiClient2.nodoRete]' 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<T>) 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 'IFAGE00201', line 1, position 14.'
    
    
    List<nodoRete> nodo2 = JsonConvert.DeserializeObject<List<nodoRete>>(dati);



    ....Restituiva gli errori che ho riportato commentati sopra l'istruzione.
    Ma quel json che hai postato non è strutturato in questo modo...

    Quote Originariamente inviata da djciko Visualizza il messaggio
    Poi, grazie a StackOverflow, ho incontrato: https://json2csharp.com e l'ho fatto funzionare.

    Vedo che il tuo esempio è preso da li' (ero da 3 giorni e sono contemporaneamente arrivato alla soluzione).

    Ho solo alcuni dubbi, poi li chiariro' con la software house che ha sviluppato le API.

    Grazie.
    No, non è un esempio preso da li, ma semplicemente quando vuoi ricreare una classe da un json in maniera abbastanza precisa è sufficiente copiare negli appunti il json e dopo da visualstudio apri il menu modifica e scegli incolla speciale->incolla json come classi.
    Niente di complicato o esterno e sei sicuro che hai le classi corrette per quel json.

    Quote Originariamente inviata da djciko Visualizza il messaggio
    Ah, un'altra istruzione funzionava, provala:

    codice:
    // restituisce un Newtonsoft.Json.Linq.JObject 
    dynamic ramoreteOut = JsonConvert.DeserializeObject(dati);

    ma non sapevo maneggiare l'oggetto di ritorno (Newtonsoft.Json.Linq.JObject ??)
    é un dynamic, quindi semplicemente chiami i suoi membri dopo il punto come un qualsiasi oggetto tenendo presente in compilazione non da errori (e ovviamente visual studio non da suggerimenti), ma se il nome del membro della classe non esiste darà un errore in runtime.

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,275
    Immaginef.png
    Anche ora (prima di postare questo presumo) vedo quello nell'immagine allegata.


    EDIT: ora con questo altro post lo vedo.

    P.S.
    ok l'immagine è piccola e non si vede molto... pardon, ma fidati c'è scritto che l'ultimo messaggio è il tuo.
    Lo vedo solo io così?

  7. #7
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,800
    non lo so, avendo postato un'altra cosa ora si vede il tuo nome anche da fuori.


    prova a postare qualcosa con codice, senza post successivo.

    (dopo aver capito questo problema del forum ti rispondo al quesito tecnico del post)

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    1,275
    Quote Originariamente inviata da djciko Visualizza il messaggio
    non lo so, avendo postato un'altra cosa ora si vede il tuo nome anche da fuori.


    prova a postare qualcosa con codice, senza post successivo.

    (dopo aver capito questo problema del forum ti rispondo al quesito tecnico del post)
    Ricreo tutto, quindi anche il quote.

    codice:
    if(siVede)
    FammiSapere;
    else
    FammiSapereComunque;

  9. #9

  10. #10
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,800
    Ma quel json che hai postato non è strutturato in questo modo...
    il json è questo:

    codice:
    {
        "IFAGE00201": {
            "UTERET_profilo_rete_comm": "IFAGE00201",
            "DTAIAR_data_da": "20180101",
            "DTAFAR_data_a": "20491231",
            "QALRET_qualifica_rete": "COL",
            "CDCLAR_cod_controparte": "AGE002",
            "ndg_cdclar": "",
            "RASOC_ragione_sociale": "AGENTE SPECIAL FASCIA 1",
            "FILARE_filiale": "01",
            "CDLIAR_cod_controp_liquid": "AGE002",
            "ndg_cdliar": "",
            "UTPDAR_utente_padre": "IFIFI00101",
            "ndg_utpdar": "",
            "GRURET_gruppo_appartenenza": "",
            "AIREC_abilitato_caricamento": "S",
            "ACFRE_abilitato_caricamento_figli": "",
            "dataRif": "20201010",
            "XCDRES_responsabile": "AP",
            "listaProdottiAbilit": "C2,CA,CB,CC,CF,CH,CI,CN,DA,DB,DC,DH,DI,FI,PE,PN,PR,PS,PT,PU",
            "obbligoFinanziato": ""
        }
    }

    cha intendi ?

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.