Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android

Respuesta
 
Herramientas
  #1  
Viejo 16/06/16, 17:23:42
Array

[xs_avatar]
4ris 4ris no está en línea
Miembro del foro
· Votos compra/venta: (1)
 
Fecha de registro: jun 2011
Mensajes: 80
Modelo de smartphone: Motorola defy
Tu operador: Movistar
Problema parseando JSON

Buenas compis, tengo un problemita al parsear un JSON, pues no tiene título y estoy volviendo a android después de iOS y tengo un caos bastante grande. Cabe destacar que estoy reutilizando algo de código que tenía (tengo un par de deprecates que tendré que arreglar).

Código:
  protected Boolean doInBackground(final String... args){
        String datos = leeJSon(this.ruta);
        Log.d("1", datos);
        try {
            JSONObject jsonObject = new JSONObject(datos);
            String strData = jsonObject.getString(""); //Puede que haya que quitar esta línea
            JSONArray jsonContent = new JSONArray(strData);
            int numItems = jsonContent.length();
            MainActivity.hacks = new Hack[numItems];
            for (int i = 0; i <numItems ; i++ ){
                JSONObject itemJson = jsonContent.getJSONObject(i);
                Hack hack = new Hack();
                hack.setTitle(itemJson.getString("Title"));
                hack.setBreachDate(itemJson.getString("BreachDate"));
                hack.setDescription(itemJson.getString("Description"));
                MainActivity.hacks[i]=hack;
            }

        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }

    private String leeJSon(String url){
        StringBuilder builder = new StringBuilder();
        HttpClient client = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);
        try {
            HttpResponse response = client.execute(httpGet);
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if (statusCode == 200){
                HttpEntity entity = response.getEntity();
                InputStream content = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(content));
                String line;
                while ((line = reader.readLine()) != null){
                    builder.append(line);
                }

            }
        }catch (ClientProtocolException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
        return builder.toString();
    }
Se supone que al no llevar título no debería poner el jsonObject.getString?

El JSon empieza así:

[{"Title":"loquesea"....
Responder Con Cita


  #2  
Viejo 16/06/16, 17:41:09
Array

[xs_avatar]
Dexafree Dexafree no está en línea
Mr. FAQMan
· Votos compra/venta: (1)
 
Fecha de registro: dic 2008
Mensajes: 8,021
Modelo de smartphone: Samsung Galaxy S i9000 + Galaxy Tab 10.1 WiFi
Tu operador: Movistar
Segun lo que muestras, el JSON es un JSONArray, no un JSONObject (te recomiendo que te mires la estructura de JSON).

Moviendo JSONArray jsonContent a la primera linea deberia funcionarte al menos esa parte (cambiando strData por datos)
Responder Con Cita
  #3  
Viejo 16/06/16, 18:01:16
Array

[xs_avatar]
4ris 4ris no está en línea
Miembro del foro
· Votos compra/venta: (1)
 
Fecha de registro: jun 2011
Mensajes: 80
Modelo de smartphone: Motorola defy
Tu operador: Movistar
 Cita: Originalmente Escrito por Dexafree Ver Mensaje
Segun lo que muestras, el JSON es un JSONArray, no un JSONObject (te recomiendo que te mires la estructura de JSON).

Moviendo JSONArray jsonContent a la primera linea deberia funcionarte al menos esa parte (cambiando strData por datos)
Perfecto compi, lo dejé así y me va de lujo

Código:
 protected Boolean doInBackground(final String... args){
        String datos = leeJSon(this.ruta);
        Log.d("1", datos);
        try {
            JSONArray jsonContent = new JSONArray(datos);
            int numItems = jsonContent.length();
            MainActivity.hacks = new Hack[numItems];
            for (int i = 0; i <numItems ; i++ ){
                JSONObject itemJson = jsonContent.getJSONObject(i);
                Hack hack = new Hack();
                hack.setTitle(itemJson.getString("Title"));
                hack.setBreachDate(itemJson.getString("BreachDate"));
                hack.setDescription(itemJson.getString("Description"));
                MainActivity.hacks[i]=hack;
            }

        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }
Pero sí, tengo que volver a mirarme el parseo bien en android y actualizado. Con lo fácil que es en iOS

Y bueno, el segundo método que hace la conexión HTTP y la mayoría de los HttpClient, get, default están deprecates. Me imagino que este método es basura no?

Código:
private String leeJSon(String url){
        StringBuilder builder = new StringBuilder();
        HttpClient client = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);
        try {
            HttpResponse response = client.execute(httpGet);
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if (statusCode == 200){
                HttpEntity entity = response.getEntity();
                InputStream content = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(content));
                String line;
                while ((line = reader.readLine()) != null){
                    builder.append(line);
                }

            }
        }catch (ClientProtocolException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
        return builder.toString();
    }
Responder Con Cita
  #4  
Viejo 16/06/16, 21:49:29
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Usa la librería GSon (de Google) y te olvidarás de que estás trabajando con un JSON, te automatiza todo el proceso de serialización y deserialización.

En cuanto al HTTPClient, lleva deprecated desde Android 2.3, y sin que sirva de precedente, la han retirado en Android 6.0. Ya que Google a diferencia de Apple cuando "depreca" algo no lo retira en la siguiente versión.

Usa HttpUrlConnection, o mejor, usa la librería Volley (también de Google) que agiliza muchísimas cosas implicadas en una conexión HTTP, además de hacer automáticamente las tareas que son en segundo plano, ahorrándote el AsyncTask correspondiente.
Responder Con Cita
  #5  
Viejo 16/06/16, 21:52:50
Array

[xs_avatar]
4ris 4ris no está en línea
Miembro del foro
· Votos compra/venta: (1)
 
Fecha de registro: jun 2011
Mensajes: 80
Modelo de smartphone: Motorola defy
Tu operador: Movistar
 Cita: Originalmente Escrito por kriogeN Ver Mensaje
Usa la librería GSon (de Google) y te olvidarás de que estás trabajando con un JSON, te automatiza todo el proceso de serialización y deserialización.

En cuanto al HTTPClient, lleva deprecated desde Android 2.3, y sin que sirva de precedente, la han retirado en Android 6.0. Ya que Google a diferencia de Apple cuando "depreca" algo no lo retira en la siguiente versión.

Usa HttpUrlConnection, o mejor, usa la librería Volley (también de Google) que agiliza muchísimas cosas implicadas en una conexión HTTP, además de hacer automáticamente las tareas que son en segundo plano, ahorrándote el AsyncTask correspondiente.
He estado mirando retrofit 2 y Gson, que te parece? Con eso lo tendría todo no?

Un saludo
Responder Con Cita
  #6  
Viejo 16/06/16, 22:40:42
Array

[xs_avatar]
Dexafree Dexafree no está en línea
Mr. FAQMan
· Votos compra/venta: (1)
 
Fecha de registro: dic 2008
Mensajes: 8,021
Modelo de smartphone: Samsung Galaxy S i9000 + Galaxy Tab 10.1 WiFi
Tu operador: Movistar
 Cita: Originalmente Escrito por 4ris Ver Mensaje
He estado mirando retrofit 2 y Gson, que te parece? Con eso lo tendría todo no?
Con eso el proceso termina siendo del todo transparente, si.
Hay mil ejemplos de como hacerlos funcionar (eso si, asegurate de mirar un tutorial/ejemplo de la version de Retrofit que estes utilizando, ya que de la 1.X a la 2.X cambiaron algunas cosas)

 Cita: Originalmente Escrito por kriogeN Ver Mensaje
Usa HttpUrlConnection, o mejor, usa la librería Volley (también de Google) que agiliza muchísimas cosas implicadas en una conexión HTTP, además de hacer automáticamente las tareas que son en segundo plano, ahorrándote el AsyncTask correspondiente.
Utilicé Volley hace mucho tiempo, pero ahora soy bastante fan de OkHttp. Es amor si tienes que hacer tareas con HTTP.
Y si es simplemente para peticiones, Retrofit tambien es genial.
Carga de imagenes: Picasso.

(Si, todo de Square )
Responder Con Cita
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 06:11:25 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /