Foros del Web » Programación para mayores de 30 ;) » Java »

Acceder a datos JSON en Servlet

Estas en el tema de Acceder a datos JSON en Servlet en el foro de Java en Foros del Web. Hola a todos! Estoy tratando de aprender cómo acceder a datos JSON en un servlet en su método doPost(), que llegan desde un cliente que ...
  #1 (permalink)  
Antiguo 13/09/2015, 17:54
Avatar de Ferkhis  
Fecha de Ingreso: mayo-2011
Ubicación: Medellín
Mensajes: 52
Antigüedad: 13 años
Puntos: 2
Pregunta Acceder a datos JSON en Servlet

Hola a todos!

Estoy tratando de aprender cómo acceder a datos JSON en un servlet en su método doPost(), que llegan desde un cliente que emplea Ajax (XMLHttpRequest). No sé qué método como getParameter() usar para referirme a los datos enviados en la solicitud, ni tampoco qué objetos crear como Gson, JSONParser y demás. He visto muchos ejemplos en varias páginas, pero ninguno me funciona. Todos me devuelven Null, me dan algún error, o arrojan java.lang.NullPointerException. Si alguien pudiera darme un ejemplo usando alguna de las librerías gson, java-json o json-simple, se lo agradecería. Este es mi código hasta ahora:

HTML (index.html):

Código HTML:
Ver original
  1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  3.     <head>
  4.         <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  5.         <title>AJAX JSON Example</title>
  6.         <script type="text/javascript" src="ajaxjsonfunctions.js"></script>
  7.     </head>
  8.     <body>
  9.         <input type="text" id="name" name="name" value="PuMa" placeholder="Name..."/>
  10.         <input type="text" id="age" name="age" value="28" placeholder="Age..."/>
  11.         <input type="text" id="country" name="country" value="Colombia" placeholder="Country..."/>
  12.         <input type="button" id="sendjsonpost" name="sendjsonpost" value="Send JSON POST" />
  13.         <hr/>
  14.     </body>
  15. </html>

JavaScript, Ajax (ajaxjsonfunctions.js):

Código Javascript:
Ver original
  1. window.onload = function()
  2. {
  3.     var sendjsonpost = document.getElementById("sendjsonpost");
  4.  
  5.     xhr = new XMLHttpRequest();
  6.  
  7.     sendjsonpost.onclick = function()
  8.     {
  9.         var name = document.getElementById("name").value;
  10.         var age = document.getElementById("age").value;
  11.         var country = document.getElementById("country").value;
  12.  
  13.         if (name == "" || age == "" || country == "")
  14.             alert("Debe ingresar todos los datos.");
  15.         else
  16.             enviarDatosPost(name, age, country);
  17.     }
  18.  
  19.     function enviarDatosPost(name, age, country)
  20.     {
  21.         xhr.onreadystatechange = prepararRespuestaPost;
  22.         xhr.open("POST", "MessagesJSON", true);
  23.         xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
  24.         var datosJSON = crearDatosJSON(name, age, country);
  25.         alert(JSON.stringify(datosJSON));
  26.         xhr.send(JSON.stringify(datosJSON));
  27.     }
  28.  
  29.     function crearDatosJSON(name, age, country)
  30.     {
  31.         var datosJSON = {name : name, age : age, country : country};
  32.         return datosJSON;
  33.     }
  34.  
  35.     function prepararRespuestaPost()
  36.     {
  37.         if (xhr.readyState == 4)
  38.         {
  39.             if (xhr.status == 200)
  40.             {
  41.                 alert(xhr.responseText +" --- " + xhr.statusText);
  42.             }
  43.         }
  44.     }
  45. }

Servlet (MessagesJSON.java):

Código Java:
Ver original
  1. package com.puma.servlets;
  2.  
  3. import java.io.IOException;
  4. import java.util.Iterator;
  5.  
  6. import javax.servlet.ServletException;
  7. import javax.servlet.annotation.WebServlet;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. import org.json.*;
  13. import org.json.JSONObject;
  14. import org.json.simple.*;
  15.  
  16. @WebServlet(asyncSupported = true, urlPatterns = { "/MessagesJSON" })
  17. public class MessagesJSON extends HttpServlet
  18. {
  19.     private static final long serialVersionUID = 1L;
  20.  
  21.     public MessagesJSON()
  22.     {
  23.         super();
  24.     }
  25.  
  26.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
  27.     {
  28.         response.getWriter().append("Served at: ").append(request.getContextPath());
  29.     }
  30.  
  31.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
  32.     {
  33.         //******************QUÉ DEBO HACER AQUÍ?*******************
  34.     }
  35. }
  #2 (permalink)  
Antiguo 14/09/2015, 02:22
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Acceder a datos JSON en Servlet

Buenas,

Deberias poder recuperar el JSON asi:


Código Java:
Ver original
  1. BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
  2.         String json = "";
  3.         if(br != null){
  4.             json = br.readLine();
  5.         }

Posteriormente lo puedes convertir en objetos usando Gson por ejemplo.


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 14/09/2015, 10:49
 
Fecha de Ingreso: febrero-2011
Mensajes: 672
Antigüedad: 13 años, 2 meses
Puntos: 78
Respuesta: Acceder a datos JSON en Servlet

Hola,
un json es solamente un String más, como cualquier string de un input. Deberías poder recuperarlo con un request.getParameter("como_lo_llames");

Y con Gson o Jackson convertirlo a objeto.

Saludos
  #4 (permalink)  
Antiguo 14/09/2015, 11:04
Avatar de Ferkhis  
Fecha de Ingreso: mayo-2011
Ubicación: Medellín
Mensajes: 52
Antigüedad: 13 años
Puntos: 2
Exclamación Respuesta: Acceder a datos JSON en Servlet

Cita:
Iniciado por ElAthlit Ver Mensaje
Hola,
un json es solamente un String más, como cualquier string de un input. Deberías poder recuperarlo con un request.getParameter("como_lo_llames");

Y con Gson o Jackson convertirlo a objeto.

Saludos
Hola! Muchas gracias por tu respuesta. La solución de usar getParameter() la he visto mucho en internet, pero creo que sólo funciona cuando empleamos Jquery. Si te das cuenta, mi código no usa Jquery sino que emplea el XMLHttpRequest. Yo intenté usar getParameter(), pero siempre arroja null en el campo que quiero recuperar. He logrado ensamblar una solución parcial empleando la librería Gson y visitando varios posts en diferentes sitios que luce más o menos así:

Código Java:
Ver original
  1. public static class PostData //Se declara una clase con una estructura similar al JSON que se recibe
  2.     {
  3.         private String name;
  4.         private String age;
  5.         private String country;
  6.         List<String> skills;
  7.        
  8.         public String getName() { return name; }
  9.        
  10.         public String getAge() { return age; }
  11.        
  12.         public String getCountry() { return country; }
  13.        
  14.         public List<String> getSkills() { return skills; }
  15.        
  16.         public PostData() { }
  17.     }
  18.    
  19.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
  20.     {
  21.         BufferedReader reader = request.getReader(); //Se toma la fuente de datos de la solicitud
  22.         Gson gson = new Gson(); //Se crea un objeto JSON con la librería de Google
  23.         PostData data = gson.fromJson(reader, PostData.class); //Se instancia la clase Data como un objeto JSON que apunta a la fuente de datos
  24.        
  25.         //Se imprimen los datos dentro del JSON
  26.         System.out.println("Nombre: " + data.getName());
  27.         System.out.println("Edad: " + data.getAge());
  28.         System.out.println("País: " + data.getCountry());
  29.        
  30.         for (int i = 0; i < data.skills.size() ; i++)
  31.         {
  32.             System.out.println("Conocimiento " + i + ": " + data.skills.get(i).toString());
  33.         }
  34.     }
  #5 (permalink)  
Antiguo 14/09/2015, 11:08
Avatar de Ferkhis  
Fecha de Ingreso: mayo-2011
Ubicación: Medellín
Mensajes: 52
Antigüedad: 13 años
Puntos: 2
Respuesta: Acceder a datos JSON en Servlet

Hola Profesor_Falken !! Muchas gracias por tomarte el tiempo para responder. Encontré una solución un poco diferente pero que se acomoda a mis necesidades. De nuevo, gracias por atender mi inquietud.
  #6 (permalink)  
Antiguo 14/09/2015, 12:41
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Acceder a datos JSON en Servlet

Hola Ferkhis!

El motivo por el que el getParameter no te funciona no es jQuery/XMLHttpRequest.

El getParameter sirve para recuperar datos enviados desde formulario, que vienen en un formato del tipo:
clave1=valor1&clave2=valor2&etc
De tal forma que puedes recuperar el valor con:
request.getParameter("clave1");

En tu caso, envias por POST directamente una cadena JSON ({'nombre': 'nombre1', etc}), por lo que es necesario leer directamente toda la cadena de datos que llega por la request para poder parsearla posteriormente.
Esta lectura, la puedes hacer manualmente, como yo te propuse o mediante una libreria que facilite el proceso, como muy bien tu has implementado con Gson.

Un saludo
__________________
If to err is human, then programmers are the most human of us

Etiquetas: json, parse, servlet
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:35.