2012-03-22 23 views
6

Sé que este es un tema del que se habló mucho, pero aún no pude encontrar una respuesta correcta y clara a mi problema específico.Forma correcta de analizar objetos JSON que contienen matrices en Java Servlets (con Gson, por ejemplo)

Tengo un JSON que tiene este aspecto:

var myData = { "gameID" : gameID, 
       "nrOfPlayers" : 2, 
       "playerUIDs" : [123, 124] 
      }; 

La pregunta que tengo es exactamente lo que es la forma correcta (o mejor manera, estilo del reloj) para analizar esto en un servlet de Java (usando GSON por ejemplo)? En primer envío este JSON al servidor utilizando el método ajax jQuery así:

jQuery.ajax({ 
     url : path, 
     data : myData, 
     success : successFunction, 
     error : function(data) { 
      console.log("Error: ", data); 
     } , 
     type : "post", 
     timeout : 30000 
    }); 

Ahora en el servlet He aprendido que debería haber sido capaz de analizar JSON que de esta manera:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     Gson gson = new Gson(); 

     String gameID = gson.fromJson(request.getParameter("gameID"), String.class); 
     String nrOfPlayers = gson.fromJson(request.getParameter("nrOfPlayers"), String.class); 
     String[] playerUIDs = gson.fromJson(request.getParameter("playerUIDs"), String[].class); 

     log.info(gameID); 
     log.info(nrOfPlayers); 
     log.info(playerUIDs[0] +" "+ playerUIDs[1]); 
} 

Pero la variable playerUIDs IS NULL y, por supuesto, playerUIDs [0] arroja una excepción.

de excavación más profunda He descubierto que cuando un bucle a través de los nombres de petición de parámetros, que contenía una de parámetro con nombre "playerUIDs []" con el valor de solamente 123 (la primera int en la matriz). Esto fue extraño porque no parecía poder acceder a los próximos valores en absoluto.

Después leí que los objetos JSON deben stringifyed antes de post-ción por lo que añadió JSON.stringify (myData), pero ahora los nombres de los parámetros de solicitud única contenía un nombre que fue el propio objeto JSON en un estado stringified:

INFO: Parameter name = {"gameID":"b6a51aabb8364b04bce676eafde1bc87","nrOfPlayers":2,"playerUIDs":[123,124]} 

la única manera que parecía que conseguir que esto era el trabajo mediante la creación de una clase interna:

class GameStart { 
    protected String gameID; 
    protected int nrOfPlayers; 
    protected int[] playerUIDs; 
} 

Y analizar el JSON a partir del nombre de solicitud de parámetros, así:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     Gson gson = new Gson(); 
     Enumeration en = request.getParameterNames(); 
     GameStart start = null; 
     while (en.hasMoreElements()) { 
      start = gson.fromJson((String) en.nextElement(), GameStart.class); 
     } 
     log.info(start.gameID); 
     log.info(String.valueOf(start.nrOfPlayers)); 
     log.info(start.playerUIDs[0] +" "+ start.playerUIDs[1]); 
} 

Ahora todos los valores están ahí, pero esto parece más un truco (leer JSON del nombre del parámetro de solicitud) que una solución elegante, así que pensé en preguntarles cuál sería exactamente la forma "correcta" de hacer esto? ¿Me estoy perdiendo algo obvio?

¡Gracias de antemano!

Respuesta

8

Usted no se utiliza JSON para enviar los datos al servidor:

data : myData, 

Esto especifica parámetros como un objeto JavaScript, pero no necesariamente como JSON. Lo que esto significa es que si usted hace una solicitud GET con:

data: {name1: "value1", name2: "value2"} 

La solicitud será:

http://some/page?name1=value1&name2=value2 

Esto es básicamente lo que se está viendo con sus primeras llamadas, donde todo se está convirtiendo a una cadena, luego enviado como un parámetro de formulario.

Lo que estás haciendo en la segunda versión es casi lo que se supone que debes hacer.La única diferencia es que es necesario utilizar un objeto JavaScript como el parámetro a data, no sólo una cadena:

data: {arbitraryNameHere: JSON.stringify(myData)} 

Esto fijará su objeto "myData" como JSON, en el parámetro llamado "arbitraryNameHere".

+0

Muchas gracias! Eso despejó mucho el aire, ahora veo que estaba confundiendo tontamente los objetos de JavaScript como objetos JSON, pensando que son intercambiables ... –

1

En la vida real, normalmente no enviaría un objeto json real a un servlet y, en la mayoría de los casos, no administrará los valores de llenado de una solicitud. JSON es la notación de objetos de JavaScript, y es excelente cuando se consume para su uso en la codificación del lado del cliente.

Es más fácil utilizar cadena de consulta para params en lugar de una publicación con json (que parece que en realidad está haciendo). host/url? GameId = 5 & nrPlayers = 2

En cuanto a cómo poblar los valores, la convención sobre configuración es el camino a seguir para obtener el código más limpio. Puede utilizar marcos como puntales para descargar toda la transferencia de valores en el marco. No estoy seguro de cómo se ve toda la aplicación, su intención de escribir (es decir, escribir servlets desde cero es una gran manera de aprender pero no una práctica común en entornos reales de desarrollo de aplicaciones), por lo que puede ser una respuesta útil o no.

1

JSON al servidor usando jQuery método ajax

function send() { 
    var myData = {"gameID": 30, 
     "nrOfPlayers": 2, 
     "playerUIDs": [123, 124] 
    };   
    jQuery.ajax({ 
     url: "servletName", 
     data: JSON.stringify(myData), 
     success: function(){ 
      //console.log(JSON.stringify(myData)); 
     }, 
     error: function(data) { 
      console.log("Error: ", data); 
     }, 
     type: "post", 
     timeout: 30000 
    }); 
} 

botón remitente

<button onclick="send();" id="send">Send</button> 

procesamiento servlet de Java

public class servletName extends HttpServlet { 
class GameStart { 

    protected String gameID; 
    protected int nrOfPlayers; 
    protected int[] playerUIDs; 
} 
protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    Gson gson = new Gson(); 
    Enumeration en = request.getParameterNames(); 
    GameStart start = null; 
    while (en.hasMoreElements()) { 
     start = gson.fromJson((String) en.nextElement(), GameStart.class); 
    } 
    System.out.println(start.gameID); 
    System.out.println(start.playerUIDs[0] +" "+ start.playerUIDs[1]); 
} 
} 
Cuestiones relacionadas