Errore Conversione Json

di Anonimizzato20038 il
11 risposte
Buon Giorno a tutti ho un problema con una conversione di una stringa il Risultato JSON è:
{"tabripa":[{"codice":70113,"costo":10000,"pVendita":38725}],"success":1}
Il mio codice è questo:
 private void getData()
    {
        String Nbusta = eTSearch.getText().toString().trim();
        if (Nbusta.equals(""))
        {
            Toast.makeText(this,"Inserire Numero Busta",Toast.LENGTH_LONG).show();
            return;
        }
        pdLoading = ProgressDialog.show(this,"Attendere","Caricamento",false,false);
        String url = Config.DATA_URLNEGOZIO + eTNbusta.getText().toString();
        StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response)
            {
                pdLoading.dismiss();
                showJSON(response);

            }


        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error)
            {
                Toast.makeText(MainActivity.this,error.getMessage().toString(),Toast.LENGTH_LONG).show();

            }
        });

        MySingleton.getInstance(this).addToRequestQueue(stringRequest);
       // RequestQueue requestQueue = Volley.newRequestQueue(this);
        //requestQueue.add(stringRequest);
    }


    private void showJSON(String response)
    {
        String nBusta ="";
        String costo = "";

        try {

            response = response.replaceFirst("<[>.*?<]>", "");
            JSONObject jsonObject = new JSONObject(response);

            JSONArray result = jsonObject.getJSONArray(Config.JSON_ARRAY);
            JSONObject collegaData = result.getJSONObject(0);

            nBusta = collegaData.getString(Config.KEY_NBUSTA);
            costo = collegaData.getString(Config.KEY_COSTO);

        } catch (JSONException e) {
            e.printStackTrace();
        }
        eTNbusta.setText(nBusta);
        eTCosto.setText(costo);

    }
ho provato a rimuovere le parentesi quadre credendo che fosse per quello che non mi dava un oggetto corretto ma niente da fare.

Errore:
0-20 17:21:01.152 5852-5852/? W/System.err: org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject

11 Risposte

  • Aggiornamanto ho provato a togliere <br con
    response = response.replaceFirst("<br", "");
    ora l'errore è questo:
    org.json.JSONException: Expected literal value at character 1 of  />
    W/System.err: <b>Fatal error</b>:  Uncaught exception 'com_exception' with message '<b>Source:</b> Microsoft JET Database Engine<br/><b>Description:</b> Errore di sintassi (operatore mancante) nell'espressione della query 'Nbusta ='.' in D:\xampp\htdocs\riparazioni\Get_un_prodotto.php:33
    W/System.err: Stack trace:
    W/System.err: #0 D:\xampp\htdocs\riparazioni\Get_un_prodotto.php(33): com->Open('select *from ta...', Object(com))
    W/System.err: #1 {main}
    W/System.err:   thrown in <b>D:\xampp\htdocs\riparazioni\Get_un_prodotto.php</b> on line <b>33</b><br />
    vi posto anche lo script php:
    <?php
    if($_SERVER['REQUEST_METHOD']=='GET'){
    	$Nbusta  = $_GET['Nbusta'];
        
    /* La query SQL, le parentesi quadrate sono
    necessarie solo quando i nomi dei campi presentano spazi */
    $query="select *from tabripa where  Nbusta = $Nbusta" ;
    
    /* I parametri di connessione */
    $path= "D:/OneDrive/Programmazione/Android/" ;
    $db_name= "dati.mdb" ;
    $dsource=$path.$db_name ;
    $cn_string="Provider=Microsoft.Jet.OLEDB.4.0;" ;
    $cn_string.="Data Source=$dsource;" ;
    $cn_string.="Jet OLEDB:Database Password=gmpa";
    
    
    $response = array();
    
    /* La connessione */
    if (!file_exists($dsource) ){
    
    die("Il database non esiste") ;
    
    }
    $cn= new COM("ADODB.Connection");
    $cn->open($cn_string) ;
    
    /* Istanziamo un oggetto Recordset
    e inviamo la query attraverso
    il metodo Open() */
    $rs= new COM("ADODB.Recordset") ;
    $rs->Open($query,$cn) ;
    
    /* Ciclo per recuperare i valori dal recordset
    EOF= tutto il set di dati è stato esaminato 
    e il cursore è giunto in fondo */
    if (!$rs->EOF) {
        // looping through all results
        // products node
        $response["tabripa"] = array();
        
        while (!$rs->EOF) {
            // temp user array
            $product = array();
            $product["codice"] = $rs -> Fields["Nbusta"]->value;
            $product["costo"] = $rs -> Fields["costo"]->value;
    		//$product["descrizione"] = $rs -> Fields("Descrizione");
    		$product["pVendita"] = $rs -> Fields["vendita"]->value;
    		
           
    
    	    $rs -> MoveNext();
    
    
            // push single product into final response array
            array_push($response["tabripa"], $product);
        }
        // success
        $response["success"] = 1;
    
        // echoing JSON response
        echo json_encode($response);
    } else {
        // no products found
        $response["success"] = 0;
        $response["message"] = "No products found";
    
        // echo no users JSON
        echo json_encode($response);
    }
    
    /* Chiusura Recordset (da non farsi nelle query di comando) */
    $rs->Close() ;
    
    /* Pulizia dell’oggetto Recordset */
    //$rs->Release() ;
    //$rs= null ;
    
    }
    
    ?>
  • Beh a giudicare dal messaggio c'è un errore di sintassi alla riga 33 del file Get_un_prodotto.php, quindi android non c'entra nulla.

    EDIT: ho visto che nella query manca uno spazio fra l'asterisco della SELECT e la clausola FROM. Questo sicuramente non aiuta
  • Della ha scritto:


    Beh a giudicare dal messaggio c'è un errore di sintassi alla riga 33 del file Get_un_prodotto.php, quindi android non c'entra nulla.

    EDIT: ho visto che nella query manca uno spazio fra l'asterisco della SELECT e la clausola FROM. Questo sicuramente non aiuta
    Sembra che legga del codice html "<br" ma io non lo vedo e ho testato la query e funziona, l'unica cosa strana sono le parentesi quadre che di solito non ci sono. Questo è L'URL :http://192.168.3.199/riparazioni/Get_un_prodotto.php?Nbusta=79980

    e questo è il risultato senza errori e senza codice html:
    {"tabripa":[{"Nbusta":79980,"costo":58088,"pVendita":77451}],"success":1}
    L'ho testata su JSONlint è mi da che è valida
  • Quel JSON è sicuramente valido, ma bisogna vedere che cosa viene restituito all'applicazione Android. A tal proposito, prova ad inserire la seguente riga all'interno del metodo "onResponse" (nota che bisogna importare la classe android.util.Log):
    
    Log.d("MYAPP", response);
    
    e guarda che cosa compare nel LogCat sotto al tag "MYAPP".
    Secondo me non ti compare il JSON ma un messaggio di errore (e allora bisogna capire il perché)
  • Della ha scritto:


    Quel JSON è sicuramente valido, ma bisogna vedere che cosa viene restituito all'applicazione Android. A tal proposito, prova ad inserire la seguente riga all'interno del metodo "onResponse" (nota che bisogna importare la classe android.util.Log):
    
    Log.d("MYAPP", response);
    
    e guarda che cosa compare nel LogCat sotto al tag "MYAPP".
    Secondo me non ti compare il JSON ma un messaggio di errore (e allora bisogna capire il perché)
    D/MYAPP: ?<br />
             <b>Fatal error</b>:  Uncaught exception 'com_exception' with message '<b>Source:</b> Microsoft JET Database Engine<br/><b>Description:</b> Errore di sintassi (operatore mancante) nell'espressione della query 'Nbusta ='.' in D:\xampp\htdocs\riparazioni\Get_un_prodotto.php:33
             Stack trace:
             #0 D:\xampp\htdocs\riparazioni\Get_un_prodotto.php(33): com->Open('select *from ta...', Object(com))
             #1 {main}
               thrown in <b>D:\xampp\htdocs\riparazioni\Get_un_prodotto.php</b> on line <b>33</b><br />
    
  • Beh come vedi la query che viene eseguita non è quella attesa perché manca il valore NBusta. Visto che questo valore viene letto dalla richiesta, ne puoi dedurre che la richiesta che fai tramite Volley è errata. Per conferma puoi stampare nel log l'URL che richiami tramite volley.

    Comunque dal punto di vista della sicurezza è altamente sconsigliato di buttare direttamente dentro ad una query i valori che arrivano dall'esterno, perché ad esempio rischi di incappare in una SQL injection.
  • Della ha scritto:


    Beh come vedi la query che viene eseguita non è quella attesa perché manca il valore NBusta. Visto che questo valore viene letto dalla richiesta, ne puoi dedurre che la richiesta che fai tramite Volley è errata. Per conferma puoi stampare nel log l'URL che richiami tramite volley.

    Comunque dal punto di vista della sicurezza è altamente sconsigliato di buttare direttamente dentro ad una query i valori che arrivano dall'esterno, perché ad esempio rischi di incappare in una SQL injection.
    Avevi ragione ho sbagliato EditText , ora la vede ma ho un'altro errore, mi dice che non ho nessun valore.
    D/Controllo_URL.....: http://192.168.3.199/riparazioni/Get_un_prodotto.php?Nbusta=80022
    E/Surface: getSlotFromBufferLocked: unknown buffer: 0x7fc767190310
    W/System.err: org.json.JSONException: No value for result
    W/System.err:     at org.json.JSONObject.get(JSONObject.java:389)
    W/System.err:     at org.json.JSONObject.getJSONArray(JSONObject.java:584)
    W/System.err:     at com.example.paolo.myapplication.MainActivity.showJSON(MainActivity.java:99)
    W/System.err:     at com.example.paolo.myapplication.MainActivity.access$100(MainActivity.java:22)
    W/System.err:     at com.example.paolo.myapplication.MainActivity$1.onResponse(MainActivity.java:67)
    W/System.err:     at com.example.paolo.myapplication.MainActivity$1.onResponse(MainActivity.java:60)
    W/System.err:     at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:67)
    W/System.err:     at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30)
    W/System.err:     at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
    W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
    W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
    W/System.err:     at android.os.Looper.loop(Looper.java:148)
    W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5417)
    W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
    W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    D/MYAPP: ?{"tabripa":[{"Nbusta":80022,"costo":5809,"pVendita":17426}],"success":1}
    
  • No, non dice che non hai nessun valore.
    Dice che non hai nessun valore per la chiave "result", che in effetti non compare nel JSON.
    Per caso la costante JSON_ARRAY è valorizzata a "result"? Se sì, dovresti cambiarla a "tabripa".
  • Risolto non avevo impostato il nome della tabella adesso funziona
    JSONArray result = jsonObject.getJSONArray("tabripa");
    Grazie sei stato d'aiuto
  • Mi piacerebbe approfondire questo argomento
    Della ha scritto:

    Comunque dal punto di vista della sicurezza è altamente sconsigliato di buttare direttamente dentro ad una query i valori che arrivano dall'esterno, perché ad esempio rischi di incappare in una SQL injection.
    Come si potrebbe fare Per capire meglio?


  • Per la questione SQL injection la cosa migliore sarebbe usare i prepared statements (non ho mai usato ADODb né COM, quindi non so se li supporti o meno), oppure fare un minimo di filtraggio dell'input (anche se comunque la soluzione migliore è quella dei prepared statements)
Devi accedere o registrarti per scrivere nel forum
11 risposte