JSON - lettura contenuto

di il
13 risposte

JSON - lettura contenuto

Buonasera a tutti,
premetto che ho esperienze di programmazione ma NON con PHP; in questo periodo di "quarantena" mi sono buttato ed ho cercato di leggere dati da una API. Il risultato l'ho ottenuto, nel senso che l'api ritorna correttamente le informazioni nel formato JSON. Ora si tratta di estrarre alcuni dati e qui ho bisogno del vostro prezioso aiuto. Ho già provato a leggere l'oggetto, a leggere l'array ma in un modo o nell'altro ottengo sempre un errore.
Questo è un estratto con var_dump($array) ottenuto con $array = json_decode(json_encode($response),true)
Quindi dovrei ottenere un array.
In pratica ogni "IDDocumento" (ne ho riportato solo uno ma in realtà ce ne possono essere più di uno) contiene varie informazioni tra cui una o più "righe" che contiene il "Codice"

Traduco: il IDDocumento 16746 contiene "righe" con "Codice" EMB6301 e "Codice" EMB5838

Come posso leggere questi due codici EMB6301 e EMB5838 ? Riporto in fondo anche uno screenshoot della echo in modo che si veda la struttura.

array(1) { ["getDocumentiResult"]=> string(2657) "[{"IDDocumento":16746,"Numero":"517","Data":"2020-04-10T15:05:58","TipoDocumento":5,"IDContatto":1191,"IDRagioneSociale":1,"PartitaIvaContatto":"","PartitaIvaRagioneSociale":"0963","CodFiscaleContatto":"","CodFiscaleRagioneSociale":"CST602X","TotaleNetto":34.26,"TotaleIvato":41.8,"UrlXML":null,"UrlPDF":"fS16746.pdf","StatoInvioSDI":0,"DataUltimoInvioSDI":"0001-01-01T00:00:00","righe":[{"Codice":"EMB6301","Descrizione":"Gelatina Meus Cachos Segura Tudo - 500gr","PrezzoNettoUnitario":13.85,"PrezzoIvatoUnitario":16.9,"Aliquota":22.0,"Qt":1.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":13.85,"PrezzoTotaleIvato":16.9,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null},{"Codice":"EMB5838","Descrizione":"Meus Cachos Super Cachos Leave-In Condicionador 1kg - 1000gr","PrezzoNettoUnitario":20.41,"PrezzoIvatoUnitario":24.9,"Aliquota":22.0,"Qt":1.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":20.41,"PrezzoTotaleIvato":24.9,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null}]}

13 Risposte

  • Re: JSON - lettura contenuto

    Ciao,

    utilizza due foreach annidati.

    Partendo da un esempio semplificato del tuo JSON
    
    {"data":[{"IDDocumento":16746,"righe":[{"Codice":"EMB6301"},{"Codice":"EMB5838",}]},{"IDDocumento":16746,"righe":[{"Codice":"EMB6301",},{"Codice":"EMB5838",}]}]}
    
    Puoi leggere i vari codici in questo modo
    
    foreach ($json['data'] as $data) {
        foreach($data['righe'] as $riga) {
            var_dump($riga['Codice']);
        }
    }
    
    N.B Non ho capito perché hai scritto json_decode(json_encode($response),true), come mai fai prima l'encode e poi il decode? I dati ti dovrebbero arrivare già in JSON, dunque devi solo decodificarli in un array oppure in un oggetto e li leggi.
  • Re: JSON - lettura contenuto

    Grazie per la risposta. Partiamo da encode e poi decode. Girovagando per trovare la soluzione avevo incontrato una stuazione simile alla mia e la soluzione era stata quella di forzare una codifica per poi ricodificare (in realtà è inutile.....)
    Ho già fatto l'esperimento di fare due cicli FOR ma in realtà nessuna delle chiavi viene riconosciuta.
    L'errore è questo (e ovviamente ho provato con diversi campi)
    Notice: Undefined index: getDocumentoResult in /opt/lampp/htdocs/soap_doc.php on line 65
    Ciò che mi rimane difficile da capire è che php lo riconosce come un array il problema è che quando vado a leggere le chiavi non le identifica, come se tutto il contenuto fosse nell'array "getDocumentoResult" in una stringa sola.
  • Re: JSON - lettura contenuto

    Queste le righe di codice "incriminate". Sia il file che la struttura possono essere verificate nel primo messaggio

    $response = $client->__soapCall("getDocumenti",array('params'=>$params),NULL);
    $response_enc =json_encode($response);
    $response_dec = json_decode($response_enc,true); //default is obj. Set TRUE to obtain an array

    // array_dim($response_dec); // riporta 1
    // print_r(array_keys($response_dec)); // getDocumentiResult
    // Information to be extract Number of document and product(s) ID - on row(s) -
    // [0].IDDocumento
    // [0].righe[0].Codice

    foreach ($response_dec['getDocumentiResult'] as $data) {
    foreach($data['righe'] as $riga) {
    var_dump($riga['Codice']);
    }
    }
  • Re: JSON - lettura contenuto

    Fai un var_dump della response e postala.
  • Re: JSON - lettura contenuto

    Eccola: linea 74 è il secondo foreach
    array(1) { ["getDocumentiResult"]=> string(2657) "[{"IDDocumento":16746,"Numero":"517","Data":"2020-04-10T15:05:58","TipoDocumento":5,"IDContatto":1191,"IDRagioneSociale":1,"PartitaIvaContatto":"","PartitaIvaRagioneSociale":"09920370963","CodFiscaleContatto":"","CodFiscaleRagioneSociale":"C","TotaleNetto":34.2622950819672,"TotaleIvato":41.8,"UrlXML":null,"UrlPDF":"":[{"Codice":"EMB6301","Descrizione":"Gelatina Meus Cachos Segura Tudo - 500gr","PrezzoNettoUnitario":13.85,"PrezzoIvatoUnitario":16.9,"Aliquota":22.0,"Qt":1.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":13.85,"PrezzoTotaleIvato":16.9,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null},{"Codice":"EMB5838","Descrizione":"Meus Cachos Super Cachos Leave-In Condicionador 1kg - 1000gr","PrezzoNettoUnitario":20.41,"PrezzoIvatoUnitario":24.9,"Aliquota":22.0,"Qt":1.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":20.41,"PrezzoTotaleIvato":24.9,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null}]},{"IDDocumento":16745,"Numero":"516","Data":"2020-04-10T12:28:10","TipoDocumento":5,"IDContatto":1172,"IDRagioneSociale":1,"PartitaIvaContatto":"","PartitaIvaRagioneSociale":"09920370963","CodFiscaleContatto":"","CodFiscaleRagioneSociale":"C","TotaleNetto":75.2459016393443,"TotaleIvato":91.8,"UrlXML":null,"UrlPDF":"":[{"Codice":"NAT2412","Descrizione":"Tonico bomba cafe70ml - 70ml","PrezzoNettoUnitario":10.25,"PrezzoIvatoUnitario":12.5,"Aliquota":22.0,"Qt":2.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":20.5,"PrezzoTotaleIvato":25.0,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null},{"Codice":"EMB6903","Descrizione":"AfroHair Curls Activator Leave-In 500ml - 500ml","PrezzoNettoUnitario":13.03,"PrezzoIvatoUnitario":15.9,"Aliquota":22.0,"Qt":2.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":26.06,"PrezzoTotaleIvato":31.8,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null},{"Codice":"EMB6592","Descrizione":"AfroHair Hair Gelatina 500ml - 500ml","PrezzoNettoUnitario":14.34,"PrezzoIvatoUnitario":17.5,"Aliquota":22.0,"Qt":2.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":28.68,"PrezzoTotaleIvato":35.0,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null}]}]" }
    Warning: Illegal string offset 'righe' in /opt/lampp/htdocs/soap_doc.php on line 74

    Warning: Invalid argument supplied for foreach() in /opt/lampp/htdocs/soap_doc.php on line 74
  • Re: JSON - lettura contenuto

    Secondo me sbagli qualcosa, dall'immagine che hai postato in alto la struttura del JSON non dovrebbe essere quella che hai appena postato.

    Se la response ritornata è in formato JSON non devi fare json_encode, fai un json_decode e stampala a video. Poi postala qui ma utilizza i tag per il codice, non postarla come fosse testo normale.
  • Re: JSON - lettura contenuto

    Aggiungo l'encode perchè ciò che la funzione SOAP mi ritorna è un oggetto che se applico json_decode direttamnte non lo accetta.
    Questa la funzione:

    $response = $client->__SoapCall("getDocumenti",array('params'=>$params),NULL);

    L'array dei parametri è corretto perchè l'estrazione è giusta. Se vedi l'immagine dello screenshoot che ho postato appare correttamente in tutta la sua struttura.
  • Re: JSON - lettura contenuto

    Inserisco tre DUMP in successione
    VAR_DUMP della chiamata alla SOAP call
    
    object(stdClass)#2 (1) { ["getDocumentiResult"]=> string(2657) "[{"IDDocumento":16746,"Numero":"517","Data":"2020-04-10T15:05:58","TipoDocumento":5,"IDContatto":1191,"IDRagioneSociale":1,"PartitaIvaContatto":"","PartitaIvaRagioneSociale":"09920370963","CodFiscaleContatto":"","CodFiscaleRagioneSociale":"CSTCRG85E57Z602X","TotaleNetto":34.2622950819672,"TotaleIvato":41.8,"UrlXML":null,"UrlPDF":"https://belezapura.bman.it/DownloadFile.aspx?type=9&db=2FB2A72D11CE1E32141E32761C723025323E1C72BC2DF1D52C32F42DF2A723E2C32D12DF3022A71D530932532C2A7&nomeF=magBELEZAPURAdiCeliaReginaCosta%2fpdf%2fScontrino16746.pdf","StatoInvioSDI":0,"DataUltimoInvioSDI":"0001-01-01T00:00:00","righe":[{"Codice":"EMB6301","Descrizione":"Gelatina Meus Cachos Segura Tudo - 500gr","PrezzoNettoUnitario":13.85,"PrezzoIvatoUnitario":16.9,"Aliquota":22.0,"Qt":1.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":13.85,"PrezzoTotaleIvato":16.9,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null},{"Codice":"EMB5838","Descrizione":"Meus Cachos Super Cachos Leave-In Condicionador 1kg - 1000gr","PrezzoNettoUnitario":20.41,"PrezzoIvatoUnitario":24.9,"Aliquota":22.0,"Qt":1.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":20.41,"PrezzoTotaleIvato":24.9,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null}]},{"IDDocumento":16745,"Numero":"516","Data":"2020-04-10T12:28:10","TipoDocumento":5,"IDContatto":1172,"IDRagioneSociale":1,"PartitaIvaContatto":"","PartitaIvaRagioneSociale":"09920370963","CodFiscaleContatto":"","CodFiscaleRagioneSociale":"CSTCRG85E57Z602X","TotaleNetto":75.2459016393443,"TotaleIvato":91.8,"UrlXML":null,"UrlPDF":"https://belezapura.bman.it/DownloadFile.aspx?type=9&db=2FB2A72D11CE1E32141E32761C723025323E1C72BC2DF1D52C32F42DF2A723E2C32D12DF3022A71D530932532C2A7&nomeF=magBELEZAPURAdiCeliaReginaCosta%2fpdf%2fScontrino16745.pdf","StatoInvioSDI":0,"DataUltimoInvioSDI":"0001-01-01T00:00:00","righe":[{"Codice":"NAT2412","Descrizione":"Tonico bomba cafe70ml - 70ml","PrezzoNettoUnitario":10.25,"PrezzoIvatoUnitario":12.5,"Aliquota":22.0,"Qt":2.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":20.5,"PrezzoTotaleIvato":25.0,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null},{"Codice":"EMB6903","Descrizione":"AfroHair Curls Activator Leave-In 500ml - 500ml","PrezzoNettoUnitario":13.03,"PrezzoIvatoUnitario":15.9,"Aliquota":22.0,"Qt":2.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":26.06,"PrezzoTotaleIvato":31.8,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null},{"Codice":"EMB6592","Descrizione":"AfroHair Hair Gelatina 500ml - 500ml","PrezzoNettoUnitario":14.34,"PrezzoIvatoUnitario":17.5,"Aliquota":22.0,"Qt":2.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":28.68,"PrezzoTotaleIvato":35.0,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null}]}]" }
    
  • Re: JSON - lettura contenuto

    DUMP dopo la chiamata a JSON_encode
    string(2938) "{"getDocumentiResult":"[{\"IDDocumento\":16746,\"Numero\":\"517\",\"Data\":\"2020-04-10T15:05:58\",\"TipoDocumento\":5,\"IDContatto\":1191,\"IDRagioneSociale\":1,\"PartitaIvaContatto\":\"\",\"PartitaIvaRagioneSociale\":\"09920370963\",\"CodFiscaleContatto\":\"\",\"CodFiscaleRagioneSociale\":\"CSTCRG85E57Z602X\",\"TotaleNetto\":34.2622950819672,\"TotaleIvato\":41.8,\"UrlXML\":null,\"UrlPDF\":\"https:\/\/belezapura.bman.it\/DownloadFile.aspx?type=9&db=2FB2A72D11CE1E32141E32761C723025323E1C72BC2DF1D52C32F42DF2A723E2C32D12DF3022A71D530932532C2A7&nomeF=magBELEZAPURAdiCeliaReginaCosta%2fpdf%2fScontrino16746.pdf\",\"StatoInvioSDI\":0,\"DataUltimoInvioSDI\":\"0001-01-01T00:00:00\",\"righe\":[{\"Codice\":\"EMB6301\",\"Descrizione\":\"Gelatina Meus Cachos Segura Tudo - 500gr\",\"PrezzoNettoUnitario\":13.85,\"PrezzoIvatoUnitario\":16.9,\"Aliquota\":22.0,\"Qt\":1.0,\"ScontoPerc\":0.0,\"PrezzoTotaleNetto\":13.85,\"PrezzoTotaleIvato\":16.9,\"Reso\":false,\"Taglia\":null,\"Colore\":null,\"Seriale\":null},{\"Codice\":\"EMB5838\",\"Descrizione\":\"Meus Cachos Super Cachos Leave-In Condicionador 1kg - 1000gr\",\"PrezzoNettoUnitario\":20.41,\"PrezzoIvatoUnitario\":24.9,\"Aliquota\":22.0,\"Qt\":1.0,\"ScontoPerc\":0.0,\"PrezzoTotaleNetto\":20.41,\"PrezzoTotaleIvato\":24.9,\"Reso\":false,\"Taglia\":null,\"Colore\":null,\"Seriale\":null}]},{\"IDDocumento\":16745,\"Numero\":\"516\",\"Data\":\"2020-04-10T12:28:10\",\"TipoDocumento\":5,\"IDContatto\":1172,\"IDRagioneSociale\":1,\"PartitaIvaContatto\":\"\",\"PartitaIvaRagioneSociale\":\"09920370963\",\"CodFiscaleContatto\":\"\",\"CodFiscaleRagioneSociale\":\"CSTCRG85E57Z602X\",\"TotaleNetto\":75.2459016393443,\"TotaleIvato\":91.8,\"UrlXML\":null,\"UrlPDF\":\"https:\/\/belezapura.bman.it\/DownloadFile.aspx?type=9&db=2FB2A72D11CE1E32141E32761C723025323E1C72BC2DF1D52C32F42DF2A723E2C32D12DF3022A71D530932532C2A7&nomeF=magBELEZAPURAdiCeliaReginaCosta%2fpdf%2fScontrino16745.pdf\",\"StatoInvioSDI\":0,\"DataUltimoInvioSDI\":\"0001-01-01T00:00:00\",\"righe\":[{\"Codice\":\"NAT2412\",\"Descrizione\":\"Tonico bomba cafe70ml - 70ml\",\"PrezzoNettoUnitario\":10.25,\"PrezzoIvatoUnitario\":12.5,\"Aliquota\":22.0,\"Qt\":2.0,\"ScontoPerc\":0.0,\"PrezzoTotaleNetto\":20.5,\"PrezzoTotaleIvato\":25.0,\"Reso\":false,\"Taglia\":null,\"Colore\":null,\"Seriale\":null},{\"Codice\":\"EMB6903\",\"Descrizione\":\"AfroHair Curls Activator Leave-In 500ml - 500ml\",\"PrezzoNettoUnitario\":13.03,\"PrezzoIvatoUnitario\":15.9,\"Aliquota\":22.0,\"Qt\":2.0,\"ScontoPerc\":0.0,\"PrezzoTotaleNetto\":26.06,\"PrezzoTotaleIvato\":31.8,\"Reso\":false,\"Taglia\":null,\"Colore\":null,\"Seriale\":null},{\"Codice\":\"EMB6592\",\"Descrizione\":\"AfroHair Hair Gelatina 500ml - 500ml\",\"PrezzoNettoUnitario\":14.34,\"PrezzoIvatoUnitario\":17.5,\"Aliquota\":22.0,\"Qt\":2.0,\"ScontoPerc\":0.0,\"PrezzoTotaleNetto\":28.68,\"PrezzoTotaleIvato\":35.0,\"Reso\":false,\"Taglia\":null,\"Colore\":null,\"Seriale\":null}]}]"}"
  • Re: JSON - lettura contenuto

    Var_dump dopo la chiamata a JSON_decode
    
    array(1) { ["getDocumentiResult"]=> string(2657) "[{"IDDocumento":16746,"Numero":"517","Data":"2020-04-10T15:05:58","TipoDocumento":5,"IDContatto":1191,"IDRagioneSociale":1,"PartitaIvaContatto":"","PartitaIvaRagioneSociale":"09920370963","CodFiscaleContatto":"","CodFiscaleRagioneSociale":"CSTCRG85E57Z602X","TotaleNetto":34.2622950819672,"TotaleIvato":41.8,"UrlXML":null,"UrlPDF":"https://belezapura.bman.it/DownloadFile.aspx?type=9&db=2FB2A72D11CE1E32141E32761C723025323E1C72BC2DF1D52C32F42DF2A723E2C32D12DF3022A71D530932532C2A7&nomeF=magBELEZAPURAdiCeliaReginaCosta%2fpdf%2fScontrino16746.pdf","StatoInvioSDI":0,"DataUltimoInvioSDI":"0001-01-01T00:00:00","righe":[{"Codice":"EMB6301","Descrizione":"Gelatina Meus Cachos Segura Tudo - 500gr","PrezzoNettoUnitario":13.85,"PrezzoIvatoUnitario":16.9,"Aliquota":22.0,"Qt":1.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":13.85,"PrezzoTotaleIvato":16.9,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null},{"Codice":"EMB5838","Descrizione":"Meus Cachos Super Cachos Leave-In Condicionador 1kg - 1000gr","PrezzoNettoUnitario":20.41,"PrezzoIvatoUnitario":24.9,"Aliquota":22.0,"Qt":1.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":20.41,"PrezzoTotaleIvato":24.9,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null}]},{"IDDocumento":16745,"Numero":"516","Data":"2020-04-10T12:28:10","TipoDocumento":5,"IDContatto":1172,"IDRagioneSociale":1,"PartitaIvaContatto":"","PartitaIvaRagioneSociale":"09920370963","CodFiscaleContatto":"","CodFiscaleRagioneSociale":"CSTCRG85E57Z602X","TotaleNetto":75.2459016393443,"TotaleIvato":91.8,"UrlXML":null,"UrlPDF":"https://belezapura.bman.it/DownloadFile.aspx?type=9&db=2FB2A72D11CE1E32141E32761C723025323E1C72BC2DF1D52C32F42DF2A723E2C32D12DF3022A71D530932532C2A7&nomeF=magBELEZAPURAdiCeliaReginaCosta%2fpdf%2fScontrino16745.pdf","StatoInvioSDI":0,"DataUltimoInvioSDI":"0001-01-01T00:00:00","righe":[{"Codice":"NAT2412","Descrizione":"Tonico bomba cafe70ml - 70ml","PrezzoNettoUnitario":10.25,"PrezzoIvatoUnitario":12.5,"Aliquota":22.0,"Qt":2.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":20.5,"PrezzoTotaleIvato":25.0,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null},{"Codice":"EMB6903","Descrizione":"AfroHair Curls Activator Leave-In 500ml - 500ml","PrezzoNettoUnitario":13.03,"PrezzoIvatoUnitario":15.9,"Aliquota":22.0,"Qt":2.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":26.06,"PrezzoTotaleIvato":31.8,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null},{"Codice":"EMB6592","Descrizione":"AfroHair Hair Gelatina 500ml - 500ml","PrezzoNettoUnitario":14.34,"PrezzoIvatoUnitario":17.5,"Aliquota":22.0,"Qt":2.0,"ScontoPerc":0.0,"PrezzoTotaleNetto":28.68,"PrezzoTotaleIvato":35.0,"Reso":false,"Taglia":null,"Colore":null,"Seriale":null}]}]" }
    
  • Re: JSON - lettura contenuto

    Ok adesso è chiaro, il contenuto di getDocumentiResult è una stringa.

    Fai così
    $json = $response->getDocumentiResult;
    $data = json_decode($json, true);
    
    foreach ($data['righe'] as $righe) {
        echo $righe['Codice'];
    }
  • Re: JSON - lettura contenuto

    Grazie. Non funziona .
    Notice: Undefined index: righe in /opt/lampp/htdocs/api_call.php on line 57

    Warning: Invalid argument supplied for foreach() in /opt/lampp/htdocs/api_call.php on line 57
    L'errore lo da su FOREACH
  • Re: JSON - lettura contenuto

    Grazie alle preziose dritte di Flaviors200 ho (o meglio ha) risolto il problema suggerendomi questa sintassi:
    foreach ($data as $d) {
        foreach($d['righe'] as $righe) {
            echo $righe['Codice'].'<br>';
        }
    }
Devi accedere o registrarti per scrivere nel forum
13 risposte