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!
Muchas gracias! Eso despejó mucho el aire, ahora veo que estaba confundiendo tontamente los objetos de JavaScript como objetos JSON, pensando que son intercambiables ... –