|
||
|
![]() |
![]() |
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
|
||||
|
||||
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(); } El JSon empieza así: [{"Title":"loquesea".... |
|
#2
|
||||
|
||||
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)
__________________
|
#3
|
||||
|
||||
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; } ![]() 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(); } |
#4
|
||||
|
||||
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. |
#5
|
||||
|
||||
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. ![]() Un saludo |
#6
|
||||
|
||||
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) Y si es simplemente para peticiones, Retrofit tambien es genial. Carga de imagenes: Picasso. (Si, todo de Square ![]()
__________________
|
![]() |
![]() |
||||||
|