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


 
Herramientas
  #1  
Viejo 16/06/16, 17:23:42
Avatar de 4ris
4ris 4ris no está en línea
Miembro del foro
Mensajes: 80
Compra y venta: (1)
 
Fecha de registro: jun 2011
Mensajes: 80
Modelo de smartphone: Motorola defy
Tu operador: Movistar
Mencionado: 1 comentarios
Tagged: 0 hilos
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
Avatar de Dexafree
Dexafree Dexafree no está en línea
Mr. FAQMan
Mensajes: 8,021
Compra y venta: (1)
 
Fecha de registro: dic 2008
Mensajes: 8,021
Modelo de smartphone: Samsung Galaxy S i9000 + Galaxy Tab 10.1 WiFi
Versión de ROM: Android 4.1.1 Jelly Bean
Versión de Radio: KF1
Tu operador: Movistar
Mencionado: 65 comentarios
Tagged: 2 hilos
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
Avatar de 4ris
4ris 4ris no está en línea
Miembro del foro
Mensajes: 80
Compra y venta: (1)
 
Fecha de registro: jun 2011
Mensajes: 80
Modelo de smartphone: Motorola defy
Tu operador: Movistar
Mencionado: 1 comentarios
Tagged: 0 hilos
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
Avatar de kriogeN
kriogeN kriogeN no está en línea
Colaborador/a
Mensajes: 4,637
Compra y venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Versión de ROM: CM13 - CM 11
Tu operador: Vodafone
Mencionado: 60 comentarios
Tagged: 3 hilos
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
Avatar de 4ris
4ris 4ris no está en línea
Miembro del foro
Mensajes: 80
Compra y venta: (1)
 
Fecha de registro: jun 2011
Mensajes: 80
Modelo de smartphone: Motorola defy
Tu operador: Movistar
Mencionado: 1 comentarios
Tagged: 0 hilos
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
Avatar de Dexafree
Dexafree Dexafree no está en línea
Mr. FAQMan
Mensajes: 8,021
Compra y venta: (1)
 
Fecha de registro: dic 2008
Mensajes: 8,021
Modelo de smartphone: Samsung Galaxy S i9000 + Galaxy Tab 10.1 WiFi
Versión de ROM: Android 4.1.1 Jelly Bean
Versión de Radio: KF1
Tu operador: Movistar
Mencionado: 65 comentarios
Tagged: 2 hilos
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   HTCMania > Todo sobre Android > Programación y Desarrollo para Android

Herramientas

Reglas de Mensajes
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Las caritas están On
Código [IMG] está On
Código HTML está Off

Saltar a Foro



Hora actual: 10:06:04 (GMT +2)

Cookies settings
Powered by vBulletin™
Copyright © vBulletin Solutions, Inc. All rights reserved.
 
HTCMania: líderes desde el 2007