Tengo un problema a la hora de recorrer un JSON obtenido por medio de una invocación AJAX a un Servlet Java.
Servlet
Código:
Javascript// Recojo el array de Envios de BBDD Envio[] listaEnvios = DAO.getInstance().obtenEnvios(); response.setContentType("text/html;charset=UTF-8"); String[] stringarray = new String[listaEnvios.length]; String jSONArrayString = null; ObjectMapper om = new ObjectMapper(); // Convierto cada objeto Envio del array en un JSON for (int i=0; i<listaEnvios.length; i++) { String jsonString = om.writeValueAsString(listaEnvios[i]); stringarray[i] = jsonString; } // Convierto el array de JSONs en un JSON jSONArrayString = om.writeValueAsString(stringarray); // Respuesta del Servlet PrintWriter out = response.getWriter(); out.print(jSONArrayString); out.close();
Código:
El problema está en que no consigo mostrar los elementos de cada JSON del array a pesar de que éste si parece estar bien formado. Como indico en los comentarios de la función muestraEnvios() del código javascript, el array lo muestra correctamente, así como cada JSON que contiene. Pero si accedo a un elemento, muestra undefined y si intento mostrarlo recorriendo el JSON con un bucle for, lo muestra caracter a caracter como si fuera un simple string. var listaEnvios = null; /* * Crea un objeto XMLHttpRequest o devuelve false si * el navegador no lo soporta. */ function getXMLHttpRequest() { var xmlHttpReq; // Creación de un objeto XMLHttpRequest en navegadores que no son de Microsoft if (window.XMLHttpRequest) { xmlHttpReq = new XMLHttpRequest(); } else if (window.ActiveXObject) { try { // Creación de un objeto XMLHttpRequest en las últimas versiones de Internet Explorer xmlHttpReq = new ActiveXObject("Msxml2.XMLHTTP"); } catch (exp1) { try { // Creación de un objeto XMLHttpRequest en las últimas versiones de Internet Explorer xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP"); } catch (exp2) { alert("Excepción en getXMLHttpRequest()!"); }; }; } return xmlHttpReq; } /* * Ejecuta una petición AJAX */ function makeRequest(url, params) { var xmlHttpRequest = getXMLHttpRequest(); xmlHttpRequest.open("POST", url, true); xmlHttpRequest.onreadystatechange = getReadyStateHandler(xmlHttpRequest); xmlHttpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=ISO-8859-1'); xmlHttpRequest.send(params); } function getReadyStateHandler(xmlHttpRequest) { // an anonynous function returned // it listens to the XMLHttpRequest instance return function() { if (xmlHttpRequest.readyState == 4) { if (xmlHttpRequest.status == 200) { listaEnvios = JSON.parse(xmlHttpRequest.responseText); muestraEnvios(); } else { alert("Http error " + xmlHttpRequest.status + ":" + xmlHttpRequest.statusText); }; }; }; } /* * Muestra el listado de envíos */ function muestraEnvios() { // Muestra por consola el array de JSONs formado correctamente console.log(listaEnvios); // Muestra por consola el primer JSON console.log(listaEnvios[0]); for (var i in listaEnvios) { // Muestra undefined console.log(listaEnvios[i]["id"]); // Muestra cada elemento de cada JSON del array por consola caracter a caracter for (var j in listaEnvios[0]) { console.log(j); } }; }
¿Estoy haciendo mal la conversión en el servlet? Si es así, ¿por qué en la consola javascript veo el array de JSONs y cada JSON?
Agradecería cualquier ayuda.
Muchísimas gracias de antemano
Un saludo