Android - Como extraer tres registos de un JSON

 
Vista:
sin imagen de perfil
Val: 197
Plata
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Como extraer tres registos de un JSON

Publicado por Luis (97 intervenciones) el 07/08/2017 00:16:24
Hola a todos.

Primeramente decirles que no domino mucho android pero a base de leer y leer he conseguido lo mas basico y he conseguido siguiendo un tutorial crear una base de datos en un servidor y desde la aplicacion android puedo hacer una consulta y obtener todos los registros en un textview en orden ascendente segun la edad $consulta = "SELECT * FROM Alumnos ORDER BY edad";

Me retorna un archivo JSON con todos los datos y los paso a un String para poder leerlos y mostrarlos en un TextView.

Hasta aqui todo bien, muestro en un listado ( un TextView ) todos los nombres de todos los alumnos con su edad y por orden ascendente.

El problema que me encuentro, es que quiero mostrar a la vez, en otros TextView solo el nombre del alumno de menor edad en un TextView
El alumno que le sigue en otro TextView tambien solo el nombre y lo mismo con el tercer alumno que sera el mayor de los tres primeros por edad y obtener solo el nombre.

¿ Como los separo ?

Para mostrar solo el primero lo he conseguido modificando el archivo .PHP $consulta = "SELECT * FROM Alumnos ORDER BY direccion LIMIT 0,1";

Pero como ya tengo todos los registros en el JSON queria saber si es posible sacar solo esos tres registros y mostrarlos cada uno en su respectivos TextViews
TextView primerresultado;
TextView segundoresultado;
TextView tercerresultado;

Muchas gracias por su tiempo y gracias por adelantado

Aquí dejo los archivos PHP del servidor así como el MainActivity por si le puede servir a algun usuario y por si les sirve de ayuda para entenderme

obtener_alumnos.PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
/**
 * Obtiene todas las alumnos de la base de datos
 */
 
require 'Alumnos.php';
 
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
 
    // Manejar petición GET
    $alumnos = Alumnos::getAll();
 
    if ($alumnos) {
 
        $datos["estado"] = 1;
        $datos["alumnos"] = $alumnos;
 
        print json_encode($datos);
    } else {
        print json_encode(array(
            "estado" => 2,
            "mensaje" => "Ha ocurrido un error"
        ));
    }
}



Este el archivo requerido Alumnos.PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
require 'Database.php';
 
class Alumnos
{
    function __construct()
    {
    }
 
    public static function getAll()
    {
        $consulta = "SELECT * FROM Alumnos ORDER BY edad";
        try {
            // Preparar sentencia
            $comando = Database::getInstance()->getDb()->prepare($consulta);
            // Ejecutar sentencia preparada
            $comando->execute();
 
            return $comando->fetchAll(PDO::FETCH_ASSOC);
 
        } catch (PDOException $e) {
            return false;
        }
    }
}
 
?>


Y este el MainActivity de Android donde recibo el JSON con los datos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 
    Button consultar;
    TextView resultado;
 
    TextView primerresultado;
    TextView segundoresultado;
    TextView tercerresultado;
 
    // IP de mi Url
    String IP = "https://midireccionweb.com";
    // Ruta del Web Service
    String GET = IP + "/obtener_alumnos.php";
 
    ObtenerWebService hiloconexion;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        consultar = (Button)findViewById(R.id.consultar);
        resultado = (TextView)findViewById(R.id.resultado);
 
        primerresultado = (TextView)findViewById(R.id.elprimer);
        segundoresultado = (TextView)findViewById(R.id.elsegundo);
        tercerresultado = (TextView)findViewById(R.id.eltercer);
 
        // Listener del boton
        consultar.setOnClickListener(this);
 
    }
 
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.consultar:
 
                hiloconexion = new ObtenerWebService();
                hiloconexion.execute(GET,"1");   // Parámetros que recibe doInBackground
 
                break;
            default:
 
                break;
        }
    }
 
    public class ObtenerWebService extends AsyncTask<String,Void,String> {
 
        @Override
        protected String doInBackground(String... params) {
 
            String cadena = params[0];
            URL url = null; // Url de donde queremos obtener información
            String devuelve ="";
 
            if(params[1]=="1"){    // Consulta de todos los alumnos
 
                try {
                    url = new URL(cadena);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //Abrir la conexión
                    connection.setRequestProperty("User-Agent", "Mozilla/5.0" +
                            " (Linux; Android 1.5; es-ES) Ejemplo HTTP");
                    //connection.setHeader("content-type", "application/json");
 
                    int respuesta = connection.getResponseCode();
                    StringBuilder result = new StringBuilder();
 
                    if (respuesta == HttpURLConnection.HTTP_OK){
 
 
                        InputStream in = new BufferedInputStream(connection.getInputStream());  // preparo la cadena de entrada
 
                        BufferedReader reader = new BufferedReader(new InputStreamReader(in));  // la introduzco en un BufferedReader
 
                        // El siguiente proceso lo hago porque el JSONOBject necesita un String y tengo
                        // que tranformar el BufferedReader a String. Esto lo hago a traves de un
                        // StringBuilder.
 
                        String line;
                        while ((line = reader.readLine()) != null) {
                            result.append(line);        // Paso toda la entrada al StringBuilder
                        }
 
                        //Creamos un objeto JSONObject para poder acceder a los atributos (campos) del objeto.
                        JSONObject respuestaJSON = new JSONObject(result.toString());   //Creo un JSONObject a partir del StringBuilder pasado a cadena
                        //Accedemos al vector de resultados
 
                        String resultJSON = respuestaJSON.getString("estado");   // estado es el nombre del campo en el JSON
 
                        if (resultJSON=="1"){      // hay alumnos a mostrar
                            JSONArray alumnosJSON = respuestaJSON.getJSONArray("alumnos");   // estado es el nombre del campo en el JSON
                            for(int i=0;i<alumnosJSON.length();i++){
                                devuelve = devuelve + alumnosJSON.getJSONObject(i).getString("idalumno") + " " +
                                        alumnosJSON.getJSONObject(i).getString("nombre") + " " +
                                        alumnosJSON.getJSONObject(i).getString("edad") + "\n";
 
                            }
 
                        }
                        else if (resultJSON=="2"){
                            devuelve = "No hay alumnos";
                        }
                    }
 
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
 
                return devuelve;
            }
 
            return null;
        }
 
        @Override
        protected void onCancelled(String s) {
            super.onCancelled(s);
        }
 
        @Override
        protected void onPostExecute(String s) {
 
//  Aqui se muestran todos los alumnos en un unico TextView con sus campos  id/nombre/edad
 
            resultado.setText(s);
            //super.onPostExecute(s);
        }
 
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
 
        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }
    }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 197
Plata
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Como extraer tres registos de un JSON

Publicado por Luis (97 intervenciones) el 08/08/2017 22:01:25
Gracias Santiago por tomar el tiempo leyendo mi consulta.

El problema es que se que en la posición [0] esta el nbre del alumno de menor edad en la posición [1 ] el que le sigue y lo mismo con el 3º pero no se aplicar la sintaxis para poder sacar del json esos registros por separado y mostrarlos cada uno en un textviev diferente al que muestra todos los resultados
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 197
Plata
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Como extraer tres registos de un JSON

Publicado por Luis (97 intervenciones) el 08/08/2017 22:40:16
Si no me equivoco con eso le que haría es ir añadiendo y lo único que he de recuperar es un nombre
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de santiago
Val: 39
Ha disminuido 1 puesto en Android (en relación al último mes)
Gráfica de Android

Como extraer tres registos de un JSON

Publicado por santiago (16 intervenciones) el 09/08/2017 15:39:30
Como llega tu json lo puedes imprimir y copiar aqui

(y)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 197
Plata
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Como extraer tres registos de un JSON

Publicado por Luis (97 intervenciones) el 09/08/2017 23:24:32
Un poco mas arriba esta puesto el mainActivity donde se recojen todos los datod
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 197
Plata
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Como extraer tres registos de un JSON

Publicado por Luis (97 intervenciones) el 13/08/2017 11:35:30
Hola de nuevo
Se suele decir que en casa de herrero cuchillo e palo.
No he conseguido extrae los registros del JSON

El JSON llega de esta manera

1
2
3
4
5
6
7
8
String resultJSON = respuestaJSON.getString("estado");   // estado es el nombre del campo en el JSON
 
                        if (resultJSON=="1"){      // hay alumnos a mostrar
                            JSONArray alumnosJSON = respuestaJSON.getJSONArray("alumnos");   // estado es el nombre del campo en el JSON
                            for(int i=0;i<alumnosJSON.length();i++){
                                devuelve = devuelve + alumnosJSON.getJSONObject(i).getString("idalumno") + " " +
                                        alumnosJSON.getJSONObject(i).getString("nombre") + " " +
                                        alumnosJSON.getJSONObject(i).getString("direccion") + "\n";

Y luego muestra el resultado de todos los campos así

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Override
        protected void onCancelled(String s) {
            super.onCancelled(s);
        }
 
        @Override
        protected void onPostExecute(String s) {
 
      // Nuestra en el TextViev todos los alumnos con todos los campos
            resultado.setText(s);
        }
 
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
 
        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }
    }


En vista de mi bajo conocimiento he optado por la fuerza bruta:

Tenia
1
2
String GET = IP + "/obtener_alumnos.php";
 ObtenerWebService hiloconexion;

si que he creado nuevos hilos independientes para cada alumno

1
2
3
4
5
6
7
String GET_alumno1 = IP + "/obtener_alumnos1.php";
    String GET_alumno2 = IP + "/obtener_alumnos2.php";
    String GET_alumno3 = IP + "/obtener_alumnos3.php";
 
    ObtenerWebService1 hiloconexion1;
    ObtenerWebService2 hiloconexion2;
    ObtenerWebService3 hiloconexion3;


Dentro del Oncreate para que se ejecute nada mas iniciarse la activity

1
2
3
4
autolistaralumnos();
        obteneralumno1();
        obteneralumno2();
        obteneralumno3();

Lamando a sus metodos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void obteneralumno1() {
        hiloconexion1 = new ObtenerWebService1();
        hiloconexion1.execute(GET_alumno1,"1");
    }
 
    private void obteneralumno2() {
        hiloconexion2 = new ObtenerWebService2();
        hiloconexion2.execute(GET_alumno2,"1");
    }
 
    private void obteneralumno3() {
        hiloconexion3 = new ObtenerWebService3();
        hiloconexion3.execute(GET_alumno3,"1");
    }
 
    private void autolistaralumnos() {
        hiloconexion = new ObtenerWebService();
        hiloconexion.execute(GET,"1");   // Parámetros que recibe doInBackground
    }



Y creando una clase para cada una de las peticiones

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
      // Esta clase para obtener el alumno 1  y repito lo misma para obtener alumno 2 y 3
    public class ObtenerWebService1 extends AsyncTask<String,Void,String> {
 
        @Override
        protected String doInBackground(String... params) {
 
            String cadena = params[0];
            URL url = null; // Url de donde queremos obtener información
            String devuelve ="";
 
            if(params[1]=="1"){    // Consulta de alumno uno
 
                try {
                    url = new URL(cadena);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //Abrir la conexión
                    connection.setRequestProperty("User-Agent", "Mozilla/5.0" +
                            " (Linux; Android 1.5; es-ES) Ejemplo HTTP");
                    //connection.setHeader("content-type", "application/json");
 
                    int respuesta = connection.getResponseCode();
                    StringBuilder result = new StringBuilder();
 
                    if (respuesta == HttpURLConnection.HTTP_OK){
 
 
                        InputStream in = new BufferedInputStream(connection.getInputStream());  // preparo la cadena de entrada
 
                        BufferedReader reader = new BufferedReader(new InputStreamReader(in));  // la introduzco en un BufferedReader
 
                        // El siguiente proceso lo hago porque el JSONOBject necesita un String y tengo
                        // que tranformar el BufferedReader a String. Esto lo hago a traves de un
                        // StringBuilder.
 
                        String line;
                        while ((line = reader.readLine()) != null) {
                            result.append(line);        // Paso toda la entrada al StringBuilder
                        }
 
                        //Creamos un objeto JSONObject para poder acceder a los atributos (campos) del objeto.
                        JSONObject respuestaJSON = new JSONObject(result.toString());   //Creo un JSONObject a partir del StringBuilder pasado a cadena
                        //Accedemos al vector de resultados
 
                        String resultJSON = respuestaJSON.getString("estado");   // estado es el nombre del campo en el JSON
 
                        if (resultJSON=="1"){      // hay alumnos a mostrar
                            JSONArray alumnosJSON = respuestaJSON.getJSONArray("alumnos");   // estado es el nombre del campo en el JSON
                            for(int i=0;i<alumnosJSON.length();i++){
 
                      // Solo recojo el nombre
 
                                devuelve = devuelve + alumnosJSON.getJSONObject(i).getString("nombre");
 
 
                            }
 
                        }
                        else if (resultJSON=="2"){
                            devuelve = "No hay alumnos";
                        }
                    }
 
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
 
                return devuelve;
            }
 
            return null;
        }
 
        @Override
        protected void onCancelled(String s) {
            super.onCancelled(s);
        }
 
        @Override
        protected void onPostExecute(String s) {
 
     // muestro en este TextView solo el nombre del primer resultado
 
            primerresultado.setText(s);
 
        }
 
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
 
        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }
    }


Y claro en el servidor he creado nuevos archivos .php
ontener_alumno1, obtener_alumno2, obtener_alumno3

los cuales requieren de alumno1, alumno2, alumno3.

Todo una trabajo extra pero que está cumpliendo con la finalidad de que se muestren todos los alumnos en un listado y en cada TextViev el nombre del alumno1 en otro TextViev el alumno2 y en el tercer TextViev el alumno3.

Pero remitiendonos al principio del post de como extraer los tres registros del JSON y mostrarlos independientemente si algun usuario fuera tan amable de indicar como se lo agradeceria.
En el post del principio esta el codigo original.

Muchas gracias por su tiempo y si algun usuario necesita el proyecto completo sin problema se lo paso.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar