Autore Topic: Problema Httpclient - JSON  (Letto 4058 volte)

Offline paperoga61

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    lg optimus one
  • Sistema operativo:
    windows xp
Problema Httpclient - JSON
« il: 22 Marzo 2011, 15:07:02 CET »
0
Salve a tutti.
Il problema che ho è legato al fatto che sbaglio sicuramente qualcosa nella decodifica Json.
Dal LogCat mi viene restituito questo:

Errore json: org.json.JSONException: Value null of type org.json.JSONObject$1 cannot be converted to JSOCArray.

Il codice è il seguente:

Codice (Java): [Seleziona]
package com.android.remoto;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.UnknownHostException;
import java.net.InetAddress;

import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.content.Context;
import android.util.Log;

public class ActRemoto extends Activity implements OnClickListener{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);      
        final Button bottone = (Button)findViewById(R.id.button1);
       
        //setContentView(bottone);
       
        bottone.setOnClickListener(this);
    }
   
        public void onClick(View v) {
          // do something when the button is clicked
               
                Toast toast = Toast.makeText(v.getContext(),
                                "Cliccato !",
                                Toast.LENGTH_SHORT);
                toast.show();
                EditText etxt1 = (EditText)findViewById(R.id.editText1);
                String utente = etxt1.getText().toString();
               
                ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
               
                InputStream is = null;
               
                nameValuePairs.add(new BasicNameValuePair("user",utente));
               
                try{    
                        HttpClient httpclient = new DefaultHttpClient();
                       
                     HttpPost httppost = new HttpPost("http://iphonekit.altervista.org/welcome.php");
                     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                     HttpResponse response = httpclient.execute(httppost);
                     HttpEntity entity = response.getEntity();
                     is = entity.getContent();
                     
                     }catch(Exception e){
                         Log.e("log_REMOTO", "Errore nella connessione HTTP: "+e.toString());
                         Toast toast2 = Toast.makeText(v.getContext(),
                                                "Errore nella connessione HTTP !",
                                                Toast.LENGTH_SHORT);
                         toast.show();
                    }
                //convert response to stringtry
                     String result="";
                     
                try{
                      BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                       StringBuilder sb = new StringBuilder();
                       sb.append(reader.readLine() + "\n");
                       String line="0";
                       while ((line = reader.readLine()) != null) {
                                      sb.append(line + "\n");        }
                        is.close();
                        result = sb.toString();
                        Toast toast2 = Toast.makeText(v.getContext(),
                                        result,
                                                Toast.LENGTH_SHORT);
                         toast.show();
                        }catch(Exception e){
                              Log.e("log_REMOTO", "Errore nella conversione del risultato: "+e.toString());
                        }//paring datatry
                try{
                      JSONArray jArray = new JSONArray(result);
                      int[] deal_id = new int[jArray.length()+1];
                      JSONObject json_data=null;
                      for(int i=0;i<jArray.length();i++){
                             json_data = jArray.getJSONObject(i);
                             Log.i("log_tag","conta: "+json_data.getInt("conta")+
                                        ", utente: "+json_data.getString("utente")+
                                        ", pwd: "+json_data.getString("pwd"));

                                      }
                      }      catch(JSONException e1){
                                        Log.e("log_REMOTO", "Errore json: "+e1.toString());
                               } catch (Exception e1) {
                                   Log.e("log_REMOTO", "Errore JSON: "+e1.toString());
                                        e1.printStackTrace();  
                                        }
                    }
               
        }

La porzione di codice su server è:
Codice: [Seleziona]
<?php

$con = mysql_connect("localhost","XXXXXXXXX","YYYYYYYYYYYYYY");
if (!$con)
  {
  die('Connessione fallita: ' . mysql_error());
  }
?>

                <?php
                //if (isset($_POST['user']))
                {
                        $q = "SELECT * FROM utenti WHERE utente = '".$_REQUEST['user']."'";
                        //echo $q;
                        mysql_select_db("my_iphonekit", $con);
                       
                        while($e=mysql_fetch_assoc($q))
                             $output[]=$e;
                              print(json_encode($output));

                        //$ris = mysql_query($q, $con);

                       
                         
                 }
            mysql_close($con);
                ?>


***** POST EDIT by MarcoDuff: Hai lasciato in chiaro User e Password nel codice. Le ho modificate io con XXX e YYY, prossima volta fai più attenzione! *****
« Ultima modifica: 22 Marzo 2011, 15:13:16 CET da MarcoDuff »

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Problema Httpclient - JSON
« Risposta #1 il: 22 Marzo 2011, 15:17:32 CET »
0
Ci posti il codice json che tira fuori il server?

Offline paperoga61

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    lg optimus one
  • Sistema operativo:
    windows xp
Re:Problema Httpclient - JSON
« Risposta #2 il: 22 Marzo 2011, 16:02:52 CET »
0
Ovvero ?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Problema Httpclient - JSON
« Risposta #3 il: 22 Marzo 2011, 16:24:06 CET »
0
A prescindere dall'applicazione per android, se chiami il server da browser che json ti restituisce?

Offline paperoga61

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    lg optimus one
  • Sistema operativo:
    windows xp
Re:Problema Httpclient - JSON
« Risposta #4 il: 22 Marzo 2011, 16:26:34 CET »
0
Restituisce null.

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Problema Httpclient - JSON
« Risposta #5 il: 22 Marzo 2011, 16:27:59 CET »
0
Hai trovato il tuo problema!  8-)

Offline paperoga61

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    lg optimus one
  • Sistema operativo:
    windows xp
Re:Problema Httpclient - JSON
« Risposta #6 il: 22 Marzo 2011, 16:45:33 CET »
0
Chiedo scusa ma mi sfugge qualcosa. Nel codice del server ho $_REQUEST['user'] che si aspetta un input quindi se la variabile user è vuota il risultato è null. O sbaglio ?. E' quale è il nesso con il codice Android ?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Problema Httpclient - JSON
« Risposta #7 il: 22 Marzo 2011, 17:27:46 CET »
0
Allora, tento di spiegami meglio: vorrei capire che output ha il server quando lo chiami.

Se lo chiami senza passare user, restituisce null... ma tu questo null lo gestisci su android?
Nel caso in cui non ti restituisce null (ovvero passi user) potresti postare il json visualizzato?

Offline paperoga61

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    lg optimus one
  • Sistema operativo:
    windows xp
Re:Problema Httpclient - JSON
« Risposta #8 il: 22 Marzo 2011, 17:29:45 CET »
0
Ora ho capito. Vedo il da farsi.

Offline Ivan86

  • Utente junior
  • **
  • Post: 139
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S II
  • Sistema operativo:
    Windows 7
Re:Problema Httpclient - JSON
« Risposta #9 il: 29 Marzo 2011, 13:08:39 CEST »
0
Ciao. Io ho praticamente un problema simile, se non lo stesso.
Ho seguito questo link: Connecting to MySQL database | Hello Android
e ho provato a riportarlo nel mio progetto per fare una prova.

Questa la mia Activity:
Codice (Java): [Seleziona]
package it.prova;

public class ProvaActivity extends Activity implements OnClickListener {
       
        /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.prova);      
       
        Button btnProva = (Button)findViewById(R.id.btn_prova);
        btnProva .setOnClickListener(this);
    }
   
        public void onClick(View v) {
               
                String result = "";
                ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("year","1980"));
                InputStream is = null;
               
                try{
                        HttpClient httpclient = new DefaultHttpClient();
                       
                    HttpPost httppost = new HttpPost("http://miosito.altervista.org/db.php");
                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                    HttpResponse response = httpclient.execute(httppost);
                    HttpEntity entity = response.getEntity();
                    is = entity.getContent();
                     
                    }catch(Exception e){
                        Log.e("log_REMOTO", "Errore nella connessione HTTP: "+e.toString());
                   }
                     
                //convert response to string
                     
                try{
                        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                    StringBuilder sb = new StringBuilder();
                    String line=null;
                    while ((line = reader.readLine()) != null) {
                                      sb.append(line + "\n");        
                    }
                    is.close();
                    result = sb.toString();
                       
                    }catch(Exception e){
                              Log.e("log_REMOTO", "Errore nella conversione del risultato: "+e.toString());
                   }
               
                //paring data
                       
                try{
                        JSONArray jArray = new JSONArray(result);
                    for(int i=0;i<jArray.length();i++){
                            JSONObject json_data = jArray.getJSONObject(i);
                            Log.i("log_tag","id: "+json_data.getInt("id")+
                                    ", name: "+json_data.getString("name")+
                                    ", sex: "+json_data.getInt("sex")+
                                    ", birthyear: "+json_data.getInt("birthyear"));
                    }
                }catch(JSONException e1){
                        Log.e("log_REMOTO", "Errore json: "+e1.toString());
                    }catch (Exception e1){
                        Log.e("log_REMOTO", "Errore JSON: "+e1.toString());
                        e1.printStackTrace();  
                    }

                }
       
     }

Al click del Button dal LogCat esce questo errore:
03-29 11:04:24.477: ERROR/log_REMOTO(392): Errore json: org.json.JSONException: A JSONArray text must start with '[' at character 1 of null

dove sto sbagliando?

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema Httpclient - JSON
« Risposta #10 il: 29 Marzo 2011, 13:58:19 CEST »
+1
Codice (Java): [Seleziona]
  try{
                        JSONArray jArray = new JSONArray(result);
                    for(int i=0;i<jArray.length();i++){
                            JSONObject json_data = jArray.getJSONObject(i);
                            Log.i("log_tag","id: "+json_data.getInt("id")+
                                    ", name: "+json_data.getString("name")+
                                    ", sex: "+json_data.getInt("sex")+
                                    ", birthyear: "+json_data.getInt("birthyear"));
                    }
                }
Questo perchè stai provando a parsare un json in JSONArray.
Un json array è fatto cosi: [{"id":1},{"id":3},{"id":4},{"id":5}]
in questo caso hai un JSON Array di oggetti.
Il tuo codice fa il parsing di un json fatto cosi:
[{"id":1,"name":"nome","sex":1,"birthyear":1986},{..}]
verifica che il tuo JSON che ricevi dal server sia fatto cosi!
io credo che invece il tuo json sia fatto cosi:
{"array":[{"id":1,"name":"nome","sex":1,"birthyear":1986},{..}]}

in questo caso il tuo codice diventa:
Codice (Java): [Seleziona]
  try{
JSONObject root = new JSONObject(result);
                        JSONArray jArray = root.getJSONArray("array");
                    for(int i=0;i<jArray.length();i++){
                            JSONObject json_data = jArray.getJSONObject(i);
                            Log.i("log_tag","id: "+json_data.getInt("id")+
                                    ", name: "+json_data.getString("name")+
                                    ", sex: "+json_data.getInt("sex")+
                                    ", birthyear: "+json_data.getInt("birthyear"));
                    }
                }
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Ivan86

  • Utente junior
  • **
  • Post: 139
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S II
  • Sistema operativo:
    Windows 7
Re:Problema Httpclient - JSON
« Risposta #11 il: 29 Marzo 2011, 14:54:17 CEST »
0
ho provato a cambiare il codice come mi hai indicato ma da lo stesso errore, ma con {:
03-29 12:55:22.727: ERROR/log_REMOTO(447): Errore json: org.json.JSONException: A JSONObject text must begin with '{' at character 1 of null
:(
verifica che il tuo JSON che ricevi dal server sia fatto cosi!
come si fa?

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema Httpclient - JSON
« Risposta #12 il: 29 Marzo 2011, 16:29:20 CEST »
0
ho provato a cambiare il codice come mi hai indicato ma da lo stesso errore, ma con {:
03-29 12:55:22.727: ERROR/log_REMOTO(447): Errore json: org.json.JSONException: A JSONObject text must begin with '{' at character 1 of null
:(come si fa?
usa un rest client o semplicemente il browser, passandogli l'url che usi nel programma per ricevere il json!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Ivan86

  • Utente junior
  • **
  • Post: 139
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S II
  • Sistema operativo:
    Windows 7
Re:Problema Httpclient - JSON
« Risposta #13 il: 29 Marzo 2011, 19:21:53 CEST »
0
bho.. o non sto capendo nulla di come si fa sta cosa o la sto facendo in maniera errata... :-( :-(
come gli passo l'url?
con:
Codice (Java): [Seleziona]
URL url = new URL("http://miosito.altervista.org/db.php");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
?

e dove lo vedo il mio json?

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema Httpclient - JSON
« Risposta #14 il: 29 Marzo 2011, 19:30:51 CEST »
0
bho.. o non sto capendo nulla di come si fa sta cosa o la sto facendo in maniera errata... :-( :-(
come gli passo l'url?
con:
Codice (Java): [Seleziona]
URL url = new URL("http://miosito.altervista.org/db.php");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
?

e dove lo vedo il mio json?

usa un rest client o semplicemente il browser (DA PC), passandogli l'url che usi nel programma per ricevere il json!
accendi il pc, metti l'url nel browser e fai invio...
altrimenti scarichi un restClient (estensione per firefox o chrome) oppure lo scarichi standalone.
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia