Parse JSON sin sucesión de bloques Try-Catch
Quisiera analizar un JSON, pero cada vez que consigo un valor, tengo que poner la instrucción en un bloque try-catch. Aquí hay un ejemplo:
try { this.setID(jsonObject.getLong("id")); } catch (JSONException e) { } try { this.setName(jsonObject.getString("name")); } catch (JSONException e) { } //and so on....
No me importa si una instrucción surge una excepción. Así que me preguntaba si es posible eliminar todos los bloques try-catch y poner las instrucciones en conjunto.
- Cómo publicar el progreso para el análisis de archivos json de gran tamaño con GSON
- JSON problema de análisis no resuelto
- Aplicación Web de Android RESTful con Zend Framework
- Android json analizar y almacenar en la base de datos
- Org.json.JSONException: Objeto no terminado en el carácter 14
En realidad, es más un problema de Java y no sólo un problema de Android ….
EDITAR
Acaba de aclarar cuál es el problema. Cuando surge una excepción porque no hay la etiqueta que buscaba, continuaría con la siguiente comprobación de etiquetas en lugar de manejar la excepción. Para hacer esto, tengo que escribir el código como he publicado anteriormente, por lo tanto una sucesión de try-catch bloques. Buscaba una solución más rápida (y más elegante).
- ¿Cómo utilizar genéricos personalizados en la clase GSON TypeToken?
- GSON evitar el JsonSyntaxException devolver el mapeo parcial
- Análisis de JSON en Android
- Mejor manera de determinar si existe un valor en el feed de JSON
- Imágenes de Picasso Library y GridView
- Cómo borrar datos de una matriz JSON
- Cómo obtener JSON Array dentro de JSON objeto?
- AsycnTask # 3 error al analizar el objeto JSON. String no se puede convertir a JSONObject
Puede utilizar los métodos opt
lugar de los métodos get
, suponiendo que está bien que las claves no existan. Si las claves no son opcionales y su aplicación no puede recuperarse de aquellos campos que no son todos existentes, debería utilizar definitivamente los métodos get
y fallar rápidamente si se produce un error.
Otro método útil que puede utilizar es el método has()
. Esto comprueba si hay una asignación para una clave dada. (por ejemplo, if (json.has("id") id = json.optString("id"))
).
Tal vez no entiendo lo que estás pidiendo, pero ¿por qué no pones todas las llamadas a jsonObject
dentro del mismo bloque try-catch?
try { this.setID(jsonObject.getLong("id")); this.setName(jsonObject.getString("name")); } catch (JSONException e) { }
Nunca debes tragar excepciones. Por lo menos registrar un error.
Como @Sotirios estaba diciendo que no puedes ignorar una excepción json.
Puede poner toda su lectura json en un método y hacer que el método lance la JSONException, como esto:
public void readJson(String json) throws JSONException{ this.setID(jsonObject.getLong("id")); this.setName(jsonObject.getString("name")); }
pero el acero tiene que hacer un try catch cuando se llama a ese método:
try { readJson(jLine); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); }
Creo que es más un problema de biblioteca que cualquier otra cosa. Un par de bibliotecas JSON en Java tienden a agregar excepciones en sus llamadas a la biblioteca como si el diseñador quisiera usar códigos de estado de error C invasivos pero con el peso añadido de la sintaxis de excepciones de Java. Puedo entender parcialmente los motivos de tal interfaz, pero se ve muy poco elegante.
Yo sugeriría usar json-simple , que es demasiado simple a veces, pero consigue el trabajo hecho y se queda fuera del camino.
Reemplazar
jsonObject.getFoo("key")
con
jsonObject.optFoo("key")
Si no se encuentra la clave, se devuelve un valor predeterminado null
o similar en lugar de una excepción.
Si desea una sintaxis más limpia, debe buscar en gson . Si sabes cómo será el json, nada lo supera.
Si su JSON se parece a esto:
{ "id": 432942039, "name": "My name", "values": [0, 1, 2, 3] }
Se creará una clase POJO que tenga este aspecto:
public class MyClass { public MyClass() {} private long id; private String name; private int[] values; }
Y analizarlo así:
private parse(String jsonString) { Gson gson = new Gson(); MyClass myObject = gson.fromJson(jsonString, MyClass.class); }
Y eso es. No se necesitan setters; utiliza la reflexión para coincidir con los campos. No hay anotaciones. No hay errores si hay campos en su cadena JSON que no coinciden con nada en su POJO y viceversa.
- Basic Android: ¿Cómo mostrar la cadena de entrada del usuario?
- ¿Por qué no puedo usar android.util.Base64?